我在JavaWorld上找到了这篇文章,其中Allen
Holub解释了Getters / Setters的替代方法,该替代方法保留了应隐藏对象的实现的原理(他的示例代码也可以在下面找到)。
据介绍,该班Name
/ EmployeeId
/ Money
应该有一个构造函数取一个字符串-
推理是,如果你作为一个键入它int
,后来需要将其更改为一个long
,你将不得不修改类的所有用途,以及使用这种模式,您不必。
我在想:这难道不只是将问题转移到要处理的String
参数解析上吗?例如,如果所有使用EmployeeId
(从接收到Exporter
)的代码都将解析String
为int
,然后突然开始导出long
值,则您需要修改的用途完全相同…如果您开始解析它,long
则可能更改为double
(即使对于id来说,这毫无意义)…,如果您不确定要解析的内容String
,
就什么也不能实现 。
除了这个问题,我还有一个问题:我意识到这篇文章已有七年历史了,所以有人能指出我有关OO设计的最新概述,特别是有关吸气剂/设置剂和实现隐藏辩论的想法吗?
public class Employee
{ private Name name;
private EmployeeId id;
private Money salary;
public interface Exporter
{ void addName ( String name );
void addID ( String id );
void addSalary ( String salary );
}
public interface Importer
{ String provideName();
String provideID();
String provideSalary();
void open();
void close();
}
public Employee( Importer builder )
{ builder.open();
this.name = new Name ( builder.provideName() );
this.id = new EmployeeId( builder.provideID() );
this.salary = new Money ( builder.provideSalary(),
new Locale("en", "US") );
builder.close();
}
public void export( Exporter builder )
{ builder.addName ( name.toString() );
builder.addID ( id.toString() );
builder.addSalary( salary.toString() );
}
//...
}
问题1
:字符串解析似乎很奇怪。恕我直言,您只能做很多事来期待将来的增强。您可以long
从一开始就确定使用参数,或者稍后考虑添加其他构造函数。或者,您可以引入可扩展参数类。见下文。
问题2 :在几种情况下,构建器模式可能有用。
当您处理具有许多属性的非常复杂的对象时,最好在对象创建时仅对其设置一次,使用常规构造函数执行此操作可能会变得难以阅读,因为构造函数将包含很长的参数列表。将其发布为API并不是一种好方法,因为每个人都必须仔细阅读文档,并确保不要混淆参数。
取而代之的是,当您提供一个构建器时,只需要处理带有所有参数的(私有)构造器,但是类的使用者可以使用可读性更高的单个方法。
设置器不是一回事,因为它们允许您在创建对象后更改对象属性。
当您仅为您的类发布多参数构造函数,然后又决定需要添加新的(可选)属性(例如,在软件的更高版本中)时,您必须创建第二个与第一个相同的构造函数,但又需要一个参数。否则,如果只是将其添加到现有构造函数中,则会破坏与现有代码的兼容性。
使用构建器,您只需为新属性添加新方法,而所有现有代码仍然兼容。
软件开发正强烈趋向于并行执行多个线程。在这种情况下,最好使用无法创建的对象(不可变对象),因为这些对象不会导致来自多个线程的并发更新出现问题。这就是为什么不能使用setter的原因。
现在,如果要避免多参数公共构造函数的问题,那么将构建器作为非常方便的替代方法即可。
基于构建器的API可能非常易于阅读,如果构建器的方法命名巧妙,则可以编写出几乎像英文句子一样的代码。
通常,构建器是一种有用的模式,根据您使用的语言,对于API的提供者来说,它们要么真的很容易使用(例如Groovy),要么有点乏味(例如Java)。但是,对于消费者而言,它们可能同样容易。
问题内容: 简要阅读以上文章后,我发现getter和setter是糟糕的OO设计,应避免使用它们,因为它们与封装和数据隐藏相反。在这种情况下,创建对象时如何避免这种情况,以及如何将一个模型对象考虑在内。 如果需要使用吸气剂或吸气剂,还可以使用其他替代方法吗? 谢谢。 问题答案: 吸气或吸气器本身并不是很糟糕的OO设计。 不好的是编码实践,它会自动为每个单个成员包括一个getter和一个setter
Go-oo 基于 OpenOffice.org,但启动速度比后者更快,且包含一些额外的功能。看起来,Go-oo 就像是一个 OpenOffice.org 的优化及增强版本。对需要使用办公套件的朋友而言,Go-oo 是一个不错的选择。 Go-oo 主要从以下两个方面针对 OpenOffice.org 进行了增强: 兼容性更强。Go-oo 能够导入 M$ Works 文件、WordPerfect 图形
Bash Infinity Bash Infinity is a standard library and a boilerplate framework for writing tools using bash.It's modular and lightweight, while managing to implement some concepts from C#, Java or Java
OO Pinyin Guide 是一个 OpenOffice 3.0 或者更新版本的 Java 扩展,用来实现对文档进行自动的中文拼音翻译功能,该工具主要用来学习中文。
问题内容: TL; DR: 我们是否需要原型OO中的工厂/构造函数?我们可以进行范例切换并将其完全删除吗? 背景故事: 最近,我一直在用JavaScript进行原型OO,这发现用JavaScript完成的OO中有99%都在强迫使用经典的OO模式。 我对原型OO的看法是,它涉及两件事。方法(和静态数据)的静态原型以及数据绑定。我们不需要工厂或构造函数。 在JavaScript中,这些是包含函数和的对
FAQs in section [28]: [28.1] 什么是师徒指导? [28.2] 在学习OO/C++之前我应该先学C吗? [28.3] 在学习OO/C++之前我应该先学Smalltalk吗? [28.4] 我只买一本书就够了么?还是需要买几本? [28.5] 有哪些讲合理使用C++的好书? [28.6] 有哪些讲合法使用C++的好书? [28.7] 有哪些通过例子讲解C++编程的好书? [