当前位置: 首页 > news >正文

石家庄做外贸网站优秀的浏览器主页

石家庄做外贸网站,优秀的浏览器主页,中国互联网企业排名前十名,连云港网站优化方案在最近的几篇文章中#xff0c;包括“ Getters / Setters。 邪恶。 期。” #xff0c; “对象应该是不可变的”和“依赖注入容器是代码污染者” #xff0c;我普遍将所有可变对象标记为“ setter”#xff08;以set开头的对象方法#xff09;。 我的论证主要基于隐喻和抽… 在最近的几篇文章中包括“ Getters / Setters。 邪恶。 期。” “对象应该是不可变的”和“依赖注入容器是代码污染者” 我普遍将所有可变对象标记为“ setter”以set开头的对象方法。 我的论证主要基于隐喻和抽象实例。 显然这对你们中的许多人来说还不够令人信服-我收到了一些要求提供更具体和实际示例的请求。 因此为了说明我对“通过setter进行可变性”的强烈否定态度我从Apache那里获取了一个现有的commons-email Java库并以不使用setter和“对象思考”的方式重新设计了它。 我作为jcabi家族的一部分— jcabi-email发布了我的库。 让我们看看从没有吸气剂的“纯”面向对象不变的方法中获得的好处。 如果您使用commons-email发送电子邮件则代码如下所示 Email email new SimpleEmail(); email.setHostName(smtp.googlemail.com); email.setSmtpPort(465); email.setAuthenticator(new DefaultAuthenticator(user, pwd)); email.setFrom(yegorteamed.io, Yegor Bugayenko); email.addTo(dudejcabi.com); email.setSubject(how are you?); email.setMsg(Dude, how are you?); email.send(); 这是使用jcabi-email的相同方法 Postman postman new Postman.Default(new SMTP(smtp.googlemail.com, 465, user, pwd) ); Envelope envelope new Envelope.MIME(new ArrayStamp(new StSender(Yegor Bugayenko yegorteamed.io),new StRecipient(dudejcabi.com),new StSubject(how are you?)),new ArrayEnclosure(new EnPlain(Dude, how are you?)) ); postman.send(envelope); 我认为区别很明显。 在第一个示例中您正在处理一个怪物类该类可以为您做所有事情包括通过SMTP发送MIME消息创建消息配置其参数向其中添加MIME部分等等。commons的Email类电子邮件确实是一个巨大的类-33个私有属性一百多种方法大约两千行代码。 首先通过一堆设置器配置类然后要求它为您send()电子邮件。 在第二个示例中我们通过七个new调用实例化了七个对象。 Postman负责打包MIME邮件 SMTP负责通过SMTP发送邮件 标记 StSender StRecipient和StSubject 负责在传递之前配置MIME消息 EnPlain附件负责为我们要发送的消息创建MIME部分。 我们构造了这七个对象将它们封装在一起然后让邮递员为我们send()信封。 可变电子邮件有什么问题 从用户的角度来看几乎没有错。 Email是一门功能强大的类具有多个控件-只需单击正确的控件即可完成工作。 但是从开发人员的角度来看 Email类是一场噩梦。 主要是因为该课程非常大且难以维护。 因为该类非常大 所以每次您想通过引入新方法来对其进行扩展时您都会面临一个事实那就是使该类变得更糟—更长更缺乏凝聚力可读性更差更难以维护等等。感觉到您正在挖掘肮脏的东西没有希望使其变得更清洁。 我敢肯定您对这种感觉很熟悉-大多数旧版应用程序都是这样的。 它们具有巨大的多行“类”实际上是用Java编写的COBOL程序这些类是从您之前的几代程序员那里继承而来的。 开始时您精力充沛但是在滚动了这样的“课堂”几分钟后您会说-“拧紧几乎是星期六了”。 由于该类非常大 因此不再有数据隐藏或封装-可以通过100多种方法访问33个变量。 隐藏了什么 实际上此Email.java文件是一个大型的程序化2000行脚本被误称为“类”。 一旦通过调用类的方法之一跨越了类的边界任何东西都不会被隐藏。 之后您就可以完全访问可能需要的所有数据。 为什么这样不好 那么为什么我们首先需要封装 为了保护一个程序员免受另一种程序员的攻击又称为防御性编程 。 当我忙于更改MIME消息的主题时我想确保自己不会被其他方法的活动所干扰即正在更改发件人并误触了我的主题。 封装可帮助我们缩小问题的范围而此Email类的作用恰恰相反。 由于类太大 因此其单元测试比类本身还要复杂。 为什么 由于其方法和属性之间存在多个相互依赖关系。 为了测试setCharset()您必须通过调用其他一些方法来准备整个对象然后必须调用send()以确保要发送的消息实际上使用了您指定的编码。 因此为了测试单行方法setCharset()您运行了整个集成测试方案即通过SMTP发送完整的MIME消息。 显然如果其中一种方法发生更改几乎每种测试方法都会受到影响。 换句话说测试非常脆弱不可靠且过于复杂。 我可以继续讲这个“ 因为班级太多了 ”但是很明显一个小的具有凝聚力的班级总是比大班级更好。 对于我您和任何面向对象的程序员而言这都是显而易见的。 但是为什么对于Apache Commons Email的开发人员来说并不那么明显 我不认为他们是愚蠢或没有受过教育的人。 之后怎么样了 它是如何发生的以及为什么发生的 这就是它总是发生的方式。 您开始将一门课程设计为具有凝聚力坚实和小巧的东西。 您的意图非常积极。 很快您意识到该类还有其他事情要做。 然后还有其他事情。 然后甚至更多。 使您的类越来越强大的最好方法是添加将设置参数注入到类中的setter以便它可以在内部处理它们不是吗 这是问题的根本原因 根本原因是我们能够通过配置方法也称为“设置程序” 将数据插入可变对象中。 当一个对象是可变的并允许我们在需要时添加setter时我们将无限制地进行操作。 让我这样说吧– 可变的类倾向于增加规模并失去凝聚力 。 如果commons-email作者在开始时就将此Email类设为不可变的那么他们将无法向其中添加太多方法并封装太多属性。 他们将无法将其变成怪物。 为什么 因为不可变对象仅通过构造函数接受状态。 您能想象一个33参数的构造函数吗 当然不是。 首先当您使类不可变时您必须保持其凝聚力小巧牢固和强大。 因为不能封装太多也不能修改封装的内容。 只需一个构造函数的两个或三个参数就可以了。 我如何设计不可变的电子邮件 在设计jcabi-email时我从一个小而简单的类开始 Postman 。 好吧这是一个接口因为我从来没有做无接口类。 因此 Postman是…… Postman 。 他正在向其他人传递消息。 首先我创建了它的默认版本为简洁起见我省略了ctor import javax.mail.Message; Immutable class Postman.Default implements Postman {private final String host;private final int port;private final String user;private final String password;Overridevoid send(Message msg) {// create SMTP session// create transport// transport.connect(this.host, this.port, etc.)// transport.send(msg)// transport.close();} } 良好的开端它有效。 现在怎么办 好吧 Message很难构造。 它是JDK中的一个复杂类需要进行一些操作才能成为HTML电子邮件。 因此我创建了一个信封它将为我构建这个复杂的对象请注意 Postman和Envelope都是不可变的并在jcabi-aspects中使用Immutable进行了注释 Immutable interface Envelope {Message unwrap(); } 我还重构Postman以接受信封而不是消息 Immutable interface Postman {void send(Envelope env); } 到目前为止一切都很好。 现在让我们尝试创建一个简单的Envelope实现 Immutable class MIME implements Envelope {Overridepublic Message unwrap() {return new MimeMessage(Session.getDefaultInstance(new Properties()));} } 它可以工作但是没有任何用处。 它只会创建一个绝对为空的MIME消息并返回。 如何为其添加一个主题以及“ To:和“ From:地址请注意 MIME类也是不可变的 Immutable class Envelope.MIME implements Envelope {private final String subject;private final String from;private final ArrayString to;public MIME(String subj, String sender, IterableString rcpts) {this.subject subj;this.from sender;this.to new ArrayString(rcpts);}Overridepublic Message unwrap() {Message msg new MimeMessage(Session.getDefaultInstance(new Properties()));msg.setSubject(this.subject);msg.setFrom(new InternetAddress(this.from));for (String email : this.to) {msg.setRecipient(Message.RecipientType.TO,new InternetAddress(email));}return msg;} } 看起来正确且有效。 但这仍然太原始了。 CC:和BCC:如何 电子邮件文字呢 PDF附件怎么样 如果我想指定消息的编码怎么办 那Reply-To呢 我可以将所有这些参数添加到构造函数中吗 请记住该类是不可变的因此我无法介绍setReplyTo()方法。 我必须将replyTo参数传递给它的构造函数。 这是不可能的因为构造函数将有太多的参数并且没有人可以使用它。 那么我该怎么办 好吧我开始思考我们如何将“信封”的概念分解为较小的概念而这正是我所发明的。 就像现实的信封一样我的MIME对象将带有图章。 Stamp将负责配置对象Message 同样 Stamp及其所有实现者都是不可变的 Immutable interface Stamp {void attach(Message message); } 现在我可以将我的MIME类简化为以下内容 Immutable class Envelope.MIME implements Envelope {private final ArrayStamp stamps;public MIME(IterableStamp stmps) {this.stamps new ArrayStamp(stmps);}Overridepublic Message unwrap() {Message msg new MimeMessage(Session.getDefaultInstance(new Properties()));for (Stamp stamp : this.stamps) {stamp.attach(msg);}return msg;} } 现在我将为该主题创建图章例如To: From: CC: BCC:等等。 MIME类将保持不变-小内聚可读固定等。 这里重要的是为什么我决定在班级相对较小的时候决定进行重构。 确实当我的MIME类只有25行时我开始担心这些标记类。 这正是本文的重点- 不变性迫使您设计小型且具有凝聚力的对象 。 没有不变性我本来会和commons-email往同一方向发展。 我的MIME类的大小会增加迟早会变得与commons-email中的Email一样大。 阻止我的唯一原因是必须对其进行重构因为我无法通过构造函数传递所有参数。 没有不变性我就不会有那种动力我会做Apache开发人员使用commons-email所做的事情—使类膨胀并将其变成无法维护的怪物。 那是jcabi-email 。 我希望这个例子足以说明问题并且您将开始使用不可变的对象编写更简洁的代码。 相关文章 您可能还会发现以下有趣的帖子 配对支架 避免字符串串联 Java代码中的典型错误 DI容器是代码污染者 吸气剂/设定者。 邪恶。 期。 翻译自: https://www.javacodegeeks.com/2014/11/how-immutability-helps.html
http://www.pierceye.com/news/454186/

相关文章:

  • 网站建设项目经历东莞市官网网站建设企业
  • FileZilla做网站程序开发的难点
  • 网站开发前端制作网站flsh怎么做
  • 建设网站需申请什么手续如何申请公司名称注册
  • 中山网站制无锡公司建立网站
  • 优化推广网站网站建设的岗位职责
  • 网站建设制作设计优化兰州如何用织梦建网站
  • wordpress 网站禁用全屏代码百度怎么建设网站
  • 强军网网站建设北京各大网站推广服务公司
  • 西安优秀的集团门户网站建设公司网站建设中 优秀账户的标准
  • 网站建设的对比分析移动设备网站开发注意点
  • 在word上怎么做网站链接网站开发试题
  • 自己做网站新手入门淮北论坛招聘网
  • 建网站的意义大学跳蚤市场网站建设
  • 平阳做网站成都网站优化公司哪家好
  • 庆阳北京网站建设广东省建设工程执业中心网站
  • 佛山哪里有做网站的大学生文创产品设计
  • 电商网站建设运城网站图片链接怎么做的
  • 服务器建网站教程宁波网络营销推广制作
  • 微信公众号属于网站建设网站云解析域名解析
  • 网站的建设及推广在哪找可以做网站的
  • 网站经常修改好不好北京互联网公司50强
  • 知识网站有哪些h5用什么制作
  • 广州网站制作联系方式上海共有多少家企业
  • 自己建一个网站需要什么网站关键词分析工具
  • 建三江建设局网站四川省建设厅官方网站电话
  • 福建志佳建设工程发展有限公司网站vi品牌包装
  • 专业门户网站开发公司龙岩正规全网品牌营销招商
  • 网站怎么做qq微信登陆政务网站的建设时期的概述
  • 购物网站的目的和意义西安做网站xamokj