类设计 - 属性还是参数?

5

我正在设计一个类...

有些关键的方法需要传递对象参数,或者需要能够“获取”对象。

那么问题来了,是应该使用getter/setters还是直接将对象作为参数传递给方法 - 以便方法正常工作。或者,如果对象对于类的正确操作非常关键,是否应该通过构造函数设置对象?

4个回答

9

如果没有某个对象,这个类的实例就没有意义(例如,构造数据访问类而没有连接到数据库,则毫无意义),那么它就是一个“依赖项”,应该成为构造函数的一部分。

如果您的类可以在没有它的情况下存活,或者可以使用一些默认值,则可以将其作为属性并在使用之前检查是否已分配。

我强烈建议在大多数情况下使用构造函数依赖注入。


5
问题不在于它们有多“关键”(每种方法都需要按定义所需的数据)。一个更好的问题是它们变化的频率。如果每次调用该方法时它们会不同(或至少可以合理地不同),则它们应该是参数。如果它们预计在对象的生命周期内通常保持不变(或其中的重要部分),则应将其与对象一起存储。
在后一种情况下,不要仅仅依赖用户调用 setter。如果它们是必需的,则应在构造函数中设置它们,即使它们可以通过 setter 更改。

这是在处理JavaScript编码中的参数与属性时,我第一次感到有意义的事情。我认为我会使用属性来使得这些数据(可能每次运行此代码都会更改(它是一个SPA))对于我在父对象内可用。我厌倦了传递参数,当你按顺序移动它们时,它们很容易出错,如果你移动/重命名其中一个,你必须去每个相关函数并进行调整。我不喜欢那部分。所以,结合你刚才说的,我想我会使用属性。问题现在是,我何时需要参数? - blamb
顺便说一下,我还没有使用getter和setter,我只是在方法中管理我的属性,然后将它们传递。这样做有问题吗?例如:`var app; (function( irShare, $, undefined ) { "use strict"; app.irShare.toggleFormForFilterHasToggled = false; app.irShare.toggleFormForFilter = function () { //在此处执行某些操作,然后标记我们的属性 app.irShare.toggleFormForFilterHasToggled = true; }; }( window.app.irShare = window.app.irShare || {}, jQuery ));` - blamb

3
如您所述,您有以下三个选择:
使用 getter/setter 如您所知,get/set 将指示对象的状态,该状态在对象生命周期中被多次访问(通常)。因此,如果您有一个类似于“CrucialMethod1”到“CrucialMethodN”使用此状态的情况,则可以使用此选项。此外,这还有助于在外部公开状态。
作为构造函数的参数使用
通常,构造函数的参数将“指示”对象将被初始化为哪种状态。因此,如果您有一个可能会或可能不会调用“CrucialMethod”的场景,则这可能不是最合适的选择。
作为方法的参数使用
当“CrucialMethod”对传递的参数进行操作/转换(取决于)时,这将非常有用。这样可以在不依赖于参数状态的情况下调用该方法。
由您决定!

1
如果这些变量对于类的正常运行是必需的,那么你应该在构造函数中要求它们或在其中设置它们。
至于是否传递它,我更喜欢类可以自己处理,因此让它完成工作并获取所需内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接