我有一个有很多成员的班级(~20)。我想很好地初始化它,因此构造函数不是一个选项(由于许多参数),因为代码可读性差。
所以我尝试使用Builder DP。唯一的问题是它在扩展这样一个类时非常讨厌。
我应该使用什么样的设计模式来处理这种情况(有很多成员的课程)吗?
非常感谢!
答案 0 :(得分:1)
20个没有默认值的字段非常多。必须有一些方法可以将类拆分为多个类或将某些字段组合为复合对象。
例如,如果您有街道,国家/地区等字段,则可以将这些字段分组到一个Address
对象中。
如果你可以这样做几次,那么你的构造函数应该变得易于管理。
此外,如果您有20个字段没有任何默认值,那么您必须指定所有字段,以便Builder
模式丢失其值。你也可以使用构造函数。
答案 1 :(得分:1)
正如你所说,构造函数有20个字段。关于可读性,我想到的模式是 静态工厂方法 (但在Joshua Bloch's Effective Java意义上,而不是工厂方法 GoF book)。
正如他在书中所述(项目1中),静态工厂方法具有名称 (与构造函数不同),因此具有良好选择名称的静态方法更易于使用,生成的客户端代码更易于阅读。
class ManyFields {
T a;
U b;
(...)
V t;
}
这样,你可以做像
这样的事情ManyFields.withAtoFzeroed(g, h, i, ..., t)
ManyFields.onlyGandJ(g, j)
ManyFields.consonantsZeroed(a, e, i, o, u)
(...)
也就是说,适应/投入新的静态工厂方法来解决代码中的不同使用模式更容易实现,更易读。
当然,拥有一组默认值会对此有所帮助,因为这些方法所需的参数数量会减少。
此外,静态工厂方法不必在每次调用时创建新对象,允许预定义实例,缓存等。因此,如果经常请求等效对象,则可以使用此技术提高性能,除了突出显示您班级最典型的物品外。
然而,一堆静态工厂方法的有效性(就可读性而言)通常取决于您可以根据常用值,默认值等对这些参数进行分组的程度,这通常会导致需要拆分这样的大班进入小班并使用作文(如@dkaztel建议的那样)。
无论如何,在处理许多构造函数参数时,最好的方法通常是构建器。
如果你想避免它,你可以使用 method chaining 为你的制定者提高可读性。
ManyFields obj = new ManyFields();
obj.a(A).b(B).d(D).t(T).v(V).f(F);
答案 2 :(得分:0)
也许这真的很傻,但你可以用一大堆Setter制作一个新的Entity类。这将让你以任何你喜欢的方式构建对象,无论是使用构建器,加载器还是其他任何东西。
然后,让当前类接受该Entity类型的单个参数,并在构造函数中调用它上面的某种Validate方法以确保它完整,然后使用存储在Entity中的数据为该类提供动力。 / p>
创建实体及其验证规则可能需要很多样板代码,但该类的实际用法将非常简单。