标签: class-design

要避免的类(代码完成)

我对代码完整书中的段落感到有些困惑.

在"要避免的类"一节中,它写着:

"避免使用动词命名的类只有行为但没有数据的类通常不是一个类.考虑将类似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,但它也受到"贫血领域模型"的影响.

我相信这些见解将来会对我有所帮助.

class-design code-complete

38
推荐指数
3
解决办法
1510
查看次数

为什么java.lang.Throwable是一个类?

在-able结尾的接口java的形容词Serializable,Comparable等等......那么,为什么是Throwable一类?如果Throwable是接口,异常处理会不会更容易?(编辑:例如,异常类不需要扩展Exception/RuntimeException.)

显然,现在改变它是不可能的.但它可以抽象吗?这不会避免不良做法throw new Throwable();

java class-design exception-handling

38
推荐指数
2
解决办法
1万
查看次数

使用类'__new__方法作为工厂:__ init__被调用两次

我在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)

任何帮助非常感谢.

python inheritance design-patterns class-design

36
推荐指数
2
解决办法
1万
查看次数

为什么16字节是C#中struct的推荐大小?

我阅读了Cwalina的书(关于.NET应用程序的开发和设计的建议).

他说,一个好的设计结构必须小于16个字节(出于性能目的).

这究竟是为什么?

而且(更重要的是)如果我在Windows 7 x64下Core i7运行我的.NET 3.5(很快将是.NET 4.0)64位应用程序(这是基于CPU/OS的限制),我可以拥有更高效率的结构吗?

只是再次强调 - 我需要尽可能高效的结构.我试着一直把它放在堆栈上.该应用程序是多线程的,并且以亚毫秒为间隔运行,结构的当前大小为64字节.

c# struct memory-management class-design

34
推荐指数
4
解决办法
8147
查看次数

OOP:哪个类应该拥有一个方法?

我无法理解类与其方法的关系.是一种方法的东西,对象,或东西是做它?或者这完全是一个不同的概念?

具体来说,在图书馆的软件系统中,该borrow()方法是属于代表图书馆顾客的类,还是代表顾客借用的项目的类?我的直觉是,它应该patron.borrow(copy)像英语句子结构一样subject.verb(object); 但我的导师说这是错的,我不明白为什么他会borrow()属于这个Copy班级(他并没有真正解释过这个问题).我不是在寻找理由,但有人可以解释一下这种正确的关系吗?

编辑:此问题已被关闭为"非主题".我不明白.软件设计问题不适合本网站吗?

c++ java oop uml class-design

32
推荐指数
3
解决办法
1120
查看次数

哪个班级设计更好?

哪种类设计更好,为什么?

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)

oop class-design

30
推荐指数
7
解决办法
1万
查看次数

为什么将私有字段和方法放在最顶层?

我已经在许多语言的许多地方看到了这个事实上的标准,但我从来没有理解它 - 为什么把你的私人领域和方法置于类声明的顶端?隐喻地看起来私人事物应该位于底部(隐藏)并且所有公共应该位于顶部,因此当您从上到下阅读课程时,首先看到公共界面然后是内部工作.

这背后的原因是什么?

编辑:只是为了澄清,我并不是指在课堂上声明所有成员的做法,而是在公开之前将私人成员/方法放在课堂声明的顶部.

class-design

29
推荐指数
4
解决办法
5492
查看次数

在C#中,标记类静态的目的是什么?

在C#中,标记类静态的目的是什么?

如果我有一个只有静态方法的类,我可以将该类标记为静态.为什么我要将类标记为静态?如果所有方法都是静态的,并且我打算永远不会添加非静态方法,我是否不想将类标记为静态?

我环顾四周,看到了一些类似的问题,但没有一个像这样.

.net c# class-design

24
推荐指数
4
解决办法
1815
查看次数

具有超过100个属性的类的设计模式

您在设计一个拥有超过100个房产的班级时会提供哪些建议/建议/指导?

背景

  • 该类描述了发票.发票可以有超过100个描述它的属性,即日期,金额,代码等......
  • 我们提交发票的系统使用100个属性中的每一个,并作为单个实体提交(与在不同时间提交的各个部分相对).
  • 描述发票的属性是业务流程的一部分.业务流程无法更改.

建议?

  • 在面对设计具有100个属性的类时,其他人做了什么?即,用100个属性中的每一个创建类?
  • 以某种方式打破它(如果是这样,如何)?
  • 或者这在您的经历中是否相当正常?

编辑 在阅读了一些很好的回答并进一步思考之后,我认为这个问题确实没有任何单一答案.然而,由于我们最终根据LBrushkin的答案对我们的设计进行了建模,我给了他信任.尽管不是最受欢迎的答案,但LBrushkin的回答帮助我们定义了几个界面,我们在整个应用程序中聚合和重用这些界面,并推动我们调查一些可能有用的模式.

c# oop design-patterns class-design

22
推荐指数
4
解决办法
2866
查看次数

C#generics - 我可以从两个选项中选择一个吗?

假设我有以下类层次结构:

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进行编辑

.net c# generics class-design class

22
推荐指数
3
解决办法
8958
查看次数