标签: class-design

这是一个糟糕的oop设计吗?

我有一个名为Chicken的类,在Chicken中我有一些方法,所以在另一个我实例化并调用Chicken方法的类中,我可能会这样做:

Chicken chicken = new Chicken("Name","Description")


public void UpdateChicken(Chicken chicken)
{ 
   chicken.Update(chicken);
}
Run Code Online (Sandbox Code Playgroud)

以上是罚款还是存在问题,如果是这样,最好还有另一个类,例如ChickenCalculations,并执行以下操作:

public void UpdateChick(Chicken chicken)
{
    ChickenCalculations.Update(chicken);
}
Run Code Online (Sandbox Code Playgroud)

这是一个实现:

Chicken chicken = new Chicken("Bob","Coolest Chicken", 4, 123, 5, 388, true, false, true);

Chicken anotherChicken = new Chicken()
anotherChicken.Update(chicken);
chicken.Update(chicken)
Run Code Online (Sandbox Code Playgroud)

这是一个更实际的例子,而不是使用鸡:

public class AirlineBooking
{
    int BookingId {get;set;}
    string Name {get;set;}
    string Description {get;set;}
    decimal Price {get;set;}
    decimal Tax {get;set;}
    string seat {get;set;}
    bool IsActive {get;set;}
    bool IsCanceld {get;set;}


    public AirlineBooking(string name, string description, decimal price, 
                          decimal tax, …
Run Code Online (Sandbox Code Playgroud)

.net c# oop design-patterns class-design

21
推荐指数
3
解决办法
1552
查看次数

在C++中禁止复制构造函数的最可靠方法是什么?

有时需要禁止C++类中的复制构造函数,以使类变为"不可复制".当然,operator=应该同时禁止.

到目前为止,我已经看到了两种方法.方法1是将方法声明为private并且不给它实现:

class Class {
//useful stuff, then
private:
    Class( const Class& ); //not implemented anywhere
    void operator=( const Class& ); //not implemented anywhere
};
Run Code Online (Sandbox Code Playgroud)

方法2是将方法声明为private并将其赋予"空"实现:

class Class {
//useful stuff, then
private:
    Class( const Class& ) {}
    void operator=( const Class& ) {}
};
Run Code Online (Sandbox Code Playgroud)

IMO第一个更好 - 即使有一些意外的原因导致从同一个类成员函数调用复制构造函数,稍后会出现链接器错误.在第二种情况下,在运行时之前不会注意到这种情况.

第一种方法有任何严重的缺点吗?什么是更好的方式,如果有的,为什么?

c++ constructor class-design copy-constructor

21
推荐指数
3
解决办法
3164
查看次数

如何设计扩展

有一个Checkstyle规则DesignForExtension.它说:如果你有一个公共/受保护的方法,它不是抽象的,也不是最终的也不是空的,它不是"为扩展而设计的".请在Checkstyle页面上阅读此规则说明以获取基本原理.

想象一下这个案子.我有一个抽象类,它定义了一些字段和这些字段的验证方法:

public abstract class Plant {
    private String roots;
    private String trunk;

    // setters go here

    protected void validate() {
        if (roots == null) throw new IllegalArgumentException("No roots!");
        if (trunk == null) throw new IllegalArgumentException("No trunk!");
    }

    public abstract void grow();
}
Run Code Online (Sandbox Code Playgroud)

我还有一个植物的子类:

public class Tree extends Plant {
    private List<String> leaves;

    // setters go here

    @Overrides
    protected void validate() {
        super.validate();
        if (leaves == null) throw new IllegalArgumentException("No …
Run Code Online (Sandbox Code Playgroud)

java inheritance class-design

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

什么时候/为什么要在课堂上私有化?

什么时候我应该做一个功能private,为什么这是个好主意?

c++ oop class-design private-methods

20
推荐指数
3
解决办法
3万
查看次数

在Objective C中有一个类似NSArray,NSDictionary等类的可变和不可变版本的逻辑是什么?

为什么Objective C中的常见集合类(如NSString,NSArray,NSDictionary等)具有可变版本和不可变版本.分别定义它们的逻辑是什么?性能,内存管理还是其他什么?

iphone class-design objective-c foundation ios

20
推荐指数
4
解决办法
2538
查看次数

Android:我可以为多个数据库文件使用一个SQLiteOpenHelper类吗?

我的应用程序使用两个数据库(单独的文件)为了处理这些数据库,我创建了两个扩展SQLiteOpenHelper的Helper类,每个数据库一个.

我现在要添加第三个数据库并想知道是否需要创建另一个Helper类(如果我使用了第4个和第5个数据库,我还需要更多Helper类),或者我可以使用相同的Helper类进行多个数据库?

我在尝试使用一个Helper类时遇到的问题是我无法看到如何将各个数据库文件的名称传递给Helper.目前,数据库的名称被硬编码为每个Helper类的静态字段,但是如果我只有一个Helper类,我需要能够在创建单独的Helper时将不同的名称传递给构造函数对象; 问题是SQLiteOpenHelper构造函数似乎只是由Android调用,只有一个参数:Context.

database sqlite android class-design

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

如何在iPhone上初始化NSObject的子类?

我想在类中编写一些方法,以便其他类可以使用调用这些方法[instance methodName:Parameter].

如果类是其子类UIViewController,我可以用initWithNibName它来初始化它.但我想在NSObject的子类中编写方法,我该如何初始化它?

iphone class-design initialization subclass

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

非公共顶级类与静态嵌套类

在我看来,非公共顶级类和静态嵌套类在创建辅助类时基本上执行相同的任务.


A.java


public class A 
{
    public static main (String[] args)
    {
        AHelper helper = new AHelper();     
    }
}
class AHelper {}
Run Code Online (Sandbox Code Playgroud)


A.java


public class A
{
    public static main (String[] args)
    {
        A.AHelper helper = new A.AHelper();     
    }

   static class AHelper {}
}
Run Code Online (Sandbox Code Playgroud)


除了它们的引用方式之外,我认为创建辅助类的两种方式之间差别不大.它可能主要归结为偏好; 有没有人看到我错过的任何东西?我想有些人会认为每个源文件有一个类更好,但从我的角度来看,在同一个源文件中有一个非公共顶级类似乎更干净,更有条理.

java class-design

18
推荐指数
3
解决办法
5201
查看次数

用户登录的UML类图

下图是我第一次尝试创建描述用户登录网站的UML类图.

rubbishlogindesign

我确信它的设计很差,并且有很多缺陷,但我希望向你们学习如何设计一个像这样的简单登录.我对您使用设计模式以及您将使用哪些模式,如何在设计中实现它以及原因感兴趣.

任何建议,批评,意见和建议将非常感激.提前致谢.

oop uml design-patterns class-design

18
推荐指数
2
解决办法
7万
查看次数

如何确定Delphi对象是否属于特定类而不是任何后代类?

我有这些课程和程序:

 TParent = class(TObject);
 TChild1 = class(TParent);     
 TChild2 = class(TParent);

 Procedure DoSomething(obj:TParent);
Run Code Online (Sandbox Code Playgroud)

我想做的是什么时候obj,TParent而不是后代提出异常.

我想过做这样的事情:

if obj.classname = TParent.classname then raise exception.create....
Run Code Online (Sandbox Code Playgroud)

但似乎有点hackish(TM)

更多:我的意图是能够传递共享属性/过程的对象.经过深思熟虑后,根本不需要TParent Object,我需要的是我的答案中显示的接口对象.

delphi class-design

18
推荐指数
4
解决办法
2万
查看次数