我对代码完整书中的段落感到有些困惑.
在"要避免的类"一节中,它写着:
"避免使用动词命名的类只有行为但没有数据的类通常不是一个类.考虑将类似DatabaseInitialization()或StringBuilder()的类转换为其他类的例程"
我的代码主要由没有数据的动词类组成.有发票阅读器,价格计算器,消息构建器等.我这样做是为了将每个类集中到一个任务.然后我将依赖关系添加到其他类以获取其他功能.
如果我正确理解了段落,我应该使用代码
class Webservice : IInvoiceReader, IArticleReader {
public IList<Invoice> GetInvoices();
public IList<Article> GetArticles();
}
Run Code Online (Sandbox Code Playgroud)
而不是
class InvoiceReader : IInvoiceReader {
public InvoiceReader(IDataProvider dataProvider);
public IList<Invoice> GetInvoices();
}
class ArticleReader : IArticleReader {
public ArticleReader(IDataProvider dataProvider);
public IList<Article> GetArticles();
}
Run Code Online (Sandbox Code Playgroud)
编辑 感谢所有回复.
我的结论是,我目前的代码比OO更多SRP,但它也受到"贫血领域模型"的影响.
我相信这些见解将来会对我有所帮助.
在-able结尾的接口java的形容词Serializable
,Comparable
等等......那么,为什么是Throwable
一类?如果Throwable
是接口,异常处理会不会更容易?(编辑:例如,异常类不需要扩展Exception/RuntimeException.)
显然,现在改变它是不可能的.但它可以抽象吗?这不会避免不良做法throw new Throwable()
;
我在python中遇到一个奇怪的错误,其中使用__new__
类的方法作为工厂将导致__init__
实例化类的方法被调用两次.
这个想法最初是使用__new__
母类的方法根据传递的参数返回她的一个孩子的特定实例,而不必在类之外声明工厂函数.
我知道使用工厂功能将是这里使用的最佳设计模式,但是在项目的这一点上改变设计模式将是昂贵的.因此我的问题是:有没有办法避免双重调用__init__
并__init__
在这种模式中只获得一次调用?
class Shape(object):
def __new__(cls, desc):
if cls is Shape:
if desc == 'big': return Rectangle(desc)
if desc == 'small': return Triangle(desc)
else:
return super(Shape, cls).__new__(cls, desc)
def __init__(self, desc):
print "init called"
self.desc = desc
class Triangle(Shape):
@property
def number_of_edges(self): return 3
class Rectangle(Shape):
@property
def number_of_edges(self): return 4
instance = Shape('small')
print instance.number_of_edges
>>> init called
>>> init called
>>> 3
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.
我阅读了Cwalina的书(关于.NET应用程序的开发和设计的建议).
他说,一个好的设计结构必须小于16个字节(出于性能目的).
这究竟是为什么?
而且(更重要的是)如果我在Windows 7 x64下在Core i7上运行我的.NET 3.5(很快将是.NET 4.0)64位应用程序(这是基于CPU/OS的限制),我可以拥有更高效率的结构吗?
只是再次强调 - 我需要尽可能高效的结构.我试着一直把它放在堆栈上.该应用程序是多线程的,并且以亚毫秒为间隔运行,结构的当前大小为64字节.
我无法理解类与其方法的关系.是一种方法的东西,对象做,或东西是做给它?或者这完全是一个不同的概念?
具体来说,在图书馆的软件系统中,该borrow()
方法是属于代表图书馆顾客的类,还是代表顾客借用的项目的类?我的直觉是,它应该patron.borrow(copy)
像英语句子结构一样subject.verb(object)
; 但我的导师说这是错的,我不明白为什么他会borrow()
属于这个Copy
班级(他并没有真正解释过这个问题).我不是在寻找理由,但有人可以解释一下这种正确的关系吗?
编辑:此问题已被关闭为"非主题".我不明白.软件设计问题不适合本网站吗?
哪种类设计更好,为什么?
public class User
{
public String UserName;
public String Password;
public String FirstName;
public String LastName;
}
public class Employee : User
{
public String EmployeeId;
public String EmployeeCode;
public String DepartmentId;
}
public class Member : User
{
public String MemberId;
public String JoinDate;
public String ExpiryDate;
}
Run Code Online (Sandbox Code Playgroud)
要么
public class User
{
public String UserId;
public String UserName;
public String Password;
public String FirstName;
public String LastName;
}
public class Employee
{
public User UserInfo;
public String …
Run Code Online (Sandbox Code Playgroud) 我已经在许多语言的许多地方看到了这个事实上的标准,但我从来没有理解它 - 为什么把你的私人领域和方法置于类声明的顶端?隐喻地看起来私人事物应该位于底部(隐藏)并且所有公共应该位于顶部,因此当您从上到下阅读课程时,首先看到公共界面然后是内部工作.
这背后的原因是什么?
编辑:只是为了澄清,我并不是指在课堂上声明所有成员的做法,而是在公开之前将私人成员/方法放在课堂声明的顶部.
在C#中,标记类静态的目的是什么?
如果我有一个只有静态方法的类,我可以将该类标记为静态.为什么我要将类标记为静态?如果所有方法都是静态的,并且我打算永远不会添加非静态方法,我是否不想将类标记为静态?
我环顾四周,看到了一些类似的问题,但没有一个像这样.
您在设计一个拥有超过100个房产的班级时会提供哪些建议/建议/指导?
背景
建议?
编辑 在阅读了一些很好的回答并进一步思考之后,我认为这个问题确实没有任何单一答案.然而,由于我们最终根据LBrushkin的答案对我们的设计进行了建模,我给了他信任.尽管不是最受欢迎的答案,但LBrushkin的回答帮助我们定义了几个界面,我们在整个应用程序中聚合和重用这些界面,并推动我们调查一些可能有用的模式.
假设我有以下类层次结构:
Class A {...}
Class B : A {...}
Class C : A {...}
Run Code Online (Sandbox Code Playgroud)
我现在拥有的是
Class D<T> where T : A {...}
Run Code Online (Sandbox Code Playgroud)
但我想要一些形式
Class D<T> where T in {B,C}
Run Code Online (Sandbox Code Playgroud)
这是由于一些奇怪的行为,我不负责B和C有不在A中的常用方法,但是能够在T上用D调用它们会很好.
注意:我无权访问A,B或C进行编辑