举例来说,假设您有一个应用程序,该应用程序具有广泛共享的类,称为User
。此类公开有关用户,其ID,名称,对每个模块的访问级别,时区等所有信息。
用户数据显然在整个系统中得到了广泛的引用,但是无论出于何种原因,都对系统进行了设置,因此,我们不是在将用户对象传递到依赖于该对象的类中,而是从其中传递了各个属性。
需要用户ID的类仅需要GUID userId
作为参数,有时我们可能还需要用户名,因此将其作为单独的参数传递。在某些情况下,这将传递给各个方法,因此这些值根本不会保存在类级别。
每当我需要从User类访问不同的信息时,我都必须通过添加参数进行更改,而在不适合添加新的重载的地方,我也必须更改对方法或类构造函数的每个引用。
用户只是一个例子。这在我们的代码中得到了广泛的实践。
我认为这违反了开放/封闭原则,对吗?不仅是更改现有类的行为,而且是首先设置它们,以便将来很有可能需要进行广泛的更改吗?
如果我们只是传入User
对象,则可以对正在使用的类进行一些小的更改。如果必须添加参数,则可能不得不对类的引用进行数十次更改。
这种做法是否违反了其他任何原则?依赖倒置也许?尽管我们没有引用抽象,但是只有一种类型的用户,因此并没有真正需要User界面的需求。
是否还有其他违反非Solid的原则,例如基本的防御性编程原则?
我的构造函数应如下所示:
MyConstructor(GUID userid, String username)
或这个:
MyConstructor(User theUser)
发表编辑:
已经建议在“密码或对象?”中回答问题。这并未回答以下问题的问题:无论哪种方式的决定都会如何影响遵循SOLID原则的尝试,而SOLID原则是此问题的核心。
I
的SOLID
?MyConstructor
现在基本上说“我需要一个Guid
和一个string
”。那么,为什么没有提供的接口Guid
和string
,让User
实现该接口,让MyConstructor
依赖于实现该接口的实例?并且如果需要MyConstructor
更改,请更改界面。-它极大地帮助我想到了“属于” 消费者而不是提供者的接口。因此,请考虑“作为消费者,我需要做到这一点和那件事”,而不是“作为提供者,我可以做到这一点和那件事”。