Questions tagged «class-design»

有关如何设计具有最佳行业惯例的课程的一般指南。

5
如何分解构造函数?
可以说我有一个Enemy类,构造函数如下所示: public Enemy(String name, float width, float height, Vector2 position, float speed, int maxHp, int attackDamage, int defense... etc.){} 这看起来很糟糕,因为构造函数有很多参数,但是当我创建一个Enemy实例时,我需要指定所有这些内容。我还希望在Enemy类中具有这些属性,以便可以遍历它们的列表并获取/设置这些参数。我当时想也许可以将Enemy子类化为EnemyB,EnemyA,同时对它们的maxHp和其他特定属性进行硬编码,但是如果我想遍历一个Enemy列表(由EnemyA,EnemyB和EnemyC)。 我只是想学习如何干净地编码。如果有所作为,我将使用Java / C ++ / C#。朝正确方向的任何观点表示赞赏。


7
给带有“ Info”后缀的类命名的想法是什么,例如:“ SomeClass”和“ SomeClassInfo”?
我正在一个处理物理设备的项目中工作,而在如何正确命名该项目中的某些类方面一直感到困惑。 考虑到实际的设备(传感器和接收器)是一回事,而它们在软件中的表示是另一回事,我正在考虑使用“ Info”后缀名称模式命名某些类。 例如,虽然a Sensor是代表实际传感器的类(当它实际上连接到某个工作设备时),但SensorInfo将仅用于代表此类传感器的特性。例如,保存文件后,我将序列化为SensorInfo文件头,而不是序列化Sensor,这甚至都没有道理。 但是现在我很困惑,因为在对象生命周期中存在一个中间立场,我无法决定是否应该使用一种或另一种,或者如何从另一种中获取一种,甚至不能将这两种变体实际上只折叠为一个类。 而且,太普遍的示例Employee类显然只是真实人物的表示,但EmployeeInfo据我所知,没有人会建议为该类命名。 我使用的语言是.NET,这种命名模式在整个框架中似乎很常见,例如这些类: Directory和DirectoryInfo班级; File和FileInfo班级; ConnectionInfo班级(无对应Connection班级); DeviceInfo班级(无对应Device班级); 所以我的问题是:使用这种命名模式是否有共同的理由?在某些情况下,具有成对的名称(Thing和ThingInfo)是否有意义,而在其他情况下,仅应存在ThingInfo该类,或者Thing该类没有对应物?

4
为什么使用接口(例如Map)而不是实现(HashMap)来定义Java对象
在大多数Java代码中,我看到人们这样声明Java对象: Map<String, String> hashMap = new HashMap<>(); List<String> list = new ArrayList<>(); 代替: HashMap<String, String> hashMap = new HashMap<>(); ArrayList<String> list = new ArrayList<>(); 为什么偏爱使用接口而不是实际使用的实现来定义Java对象?

7
不变的类在什么时候成为负担?
在设计用于保存数据模型的类时,我已经读过它对创建不可变对象很有用,但是到什么时候构造函数参数列表和深层副本的负担变得太大,您必须放弃不可变限制? 例如,这是一个不可变的类,用于表示命名的事物(我使用C#语法,但该原理适用于所有OO语言) class NamedThing { private string _name; public NamedThing(string name) { _name = name; } public NamedThing(NamedThing other) { this._name = other._name; } public string Name { get { return _name; } } } 可以构造,查询和复制已命名的事物到新的已命名事物,但是名称不能更改。 这一切都很好,但是当我想添加另一个属性时会发生什么呢?我必须向构造函数添加一个参数并更新副本构造函数;据我所知,这不是太多的工作,但是当我想使一个复杂的对象不可变时,问题就开始了。 如果该类包含可能包含其他复杂类的属性和集合,在我看来,构造函数参数列表将成为一场噩梦。 那么,什么时候一个类变得太复杂而无法改变呢?

2
驯服“实用功能”类
在我们的Java代码库中,我不断看到以下模式: /** This is a stateless utility class that groups useful foo-related operations, often with side effects. */ public class FooUtil { public int foo(...) {...} public void bar(...) {...} } /** This class does applied foo-related things. */ class FooSomething { int DoBusinessWithFoo(FooUtil fooUtil, ...) { if (fooUtil.foo(...)) fooUtil.bar(...); …

4
将线程/后台工作者放在一类中是“错误的” /错误的设计吗?
我有一个可以从Excel中读取的类(C#和.Net 4),在该类中,我有一个后台工作程序,该工作程序将从Excel加载数据,同时UI可以保持响应。我的问题如下:在班级中有一名后台工作人员是不好的设计吗?我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?我看不到以这种方式创建课程的任何问题,但是我还是新手,所以我认为在继续之前必须确定。 我希望这个问题在这里有意义,因为我认为在我的代码正常工作时,它不应该出现在stackoverflow上,这只是一个设计问题。

7
使类方法传递类变量是一个坏主意吗?
这就是我的意思: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } add因为它是一个类方法,已经可以访问它需要的所有变量了,所以这不是一个好主意吗?有什么理由我应该或不应该这样做?

3
RxJava类Flowable是否可以合法地使用460个方法?
我刚刚开始使用RxJava,它是Java对ReactiveX的实现 (也称为Rx和Reactive Extensions)。一些真正让我吃惊的庞大规模RxJava的可流动类:它具有460点的方法! 公平起见: 有很多方法被重载,这大大增加了方法的总数。 也许应该拆分此类,但是我对RxJava的知识和理解非常有限。谁创造RxJava的人肯定是非常聪明的,他们可以大概是选择创建提供有效的参数可流动有这么多的方法。 另一方面: RxJava是Microsoft的Reactive Extensions的Java实现,甚至没有Flowable类,因此,这不是盲目移植现有类并用Java实现的情况。 [ 更新:斜体前一点是事实不正确:微软的可观察类,其中有超过400的方法,被用来作为RxJava的基础上可观察类,并且可流动相似,可观察到,但手柄背压的大量数据。因此,RxJava团队正在移植现有的类。这篇文章应该是挑战的原设计可观察到由微软而不是RxJava的类悬浮剂分类] RxJava已有3年多的历史了,因此这并不是由于缺乏对良好(SOLID)类设计原理的了解而导致代码被错误设计的示例(与Java的早期版本一样)。 对于像Flowable这样大的类,其设计本质上是错误的,但也许不是。这个SE问题的一个答案一个类方法的数量限制是多少?建议答案是“ 拥有所需的多种方法 ”。 显然,有些类无论其语言如何,都合法地需要大量方法来支持它们,因为它们不会轻易分解为更小的东西,并且它们具有大量的特征和属性。例如:字符串,颜色,电子表格单元格,数据库结果集和HTTP请求。对于类来说,也许有几十种方法来表示这些东西似乎并不合理。 但是Flowable是否真的需要460种方法,还是它是如此之大以至于它必然是不良类设计的一个例子? [需要明确的是:这个问题,特别是涉及RxJava的可流动类,而不是一般的神的对象。]

4
单一职责模式对班级应该有多具体?
例如,假设您有一个控制台游戏程序,该程序具有往返于控制台的各种输入/输出方法。难道是聪明的,让他们在一个单一inputOutput类或把它们分解到更具体的类,如startMenuIO,inGameIO,playerIO,gameBoardIO,等使得每个班大约有1-5的方法呢? 同时,如果最好将它们分解,将它们放置在IO命名空间中是否明智,从而使它们更冗长,例如:IO.inGame等?

5
基类作为工厂?
我在周末写一些代码,发现自己想写一个工厂作为基类中的静态方法。 我的问题只是想知道这是否是ac#惯用语方法? 我认为可能不是因为基类具有派生类的知识。 也就是说,我不确定要获得相同结果的简单方法。整个其他工厂类(至少对我而言)似乎不需要的复杂性(?) 就像是: class Animal { public static Animal CreateAnimal(string name) { switch(name) { case "Shark": return new SeaAnimal(); break; case "Dog": return new LandAnimal(); break; default: throw new Exception("unknown animal"); } } } class LandAnimal : Animal { } class SeaAnimal : Animal { }
14 c#  class-design 

3
接口作为行为的抽象基类?
我需要为我的C#项目设计一个类层次结构。基本上,类的功能类似于WinForms类,因此让我们以WinForms工具包为例。(但是,我不能使用WinForms或WPF。) 每个类都需要提供一些核心属性和功能。尺寸,位置,颜色,可见性(对/错),绘制方法等。 我需要设计建议我使用了一个带有抽象基类和接口的设计,这些基类和接口不是真正的类型,而更像是行为。这是一个好的设计吗?如果没有,那将是一个更好的设计。 代码如下: abstract class Control { public int Width { get; set; } public int Height { get; set; } public int BackColor { get; set; } public int X { get; set; } public int Y { get; set; } public int BorderWidth { get; set; } …

2
设计:对象方法与以对象为参数的单独类的方法?
例如,这样做更好吗? Pdf pdf = new Pdf(); pdf.Print(); 要么: Pdf pdf = new Pdf(); PdfPrinter printer = new PdfPrinter(); printer.Print(pdf); 另一个例子: Country m = new Country("Mexico"); double ratio = m.GetDebtToGDPRatio(); 要么: Country m = new Country("Mexico"); Country us = new Country("US"); DebtStatistics ds = new DebtStatistics(); double usRatio = ds.GetDebtToGDPRatio(us); double …

4
大班单责任
我有一个2500行Character类: 跟踪游戏中角色的内部状态。 加载并保持该状态。 处理大约30个传入命令(通常=将它们转发到Game,但是一些只读命令会立即得到响应)。 从Game正在采取的行动和他人的相关行动中收到约80个电话。 在我看来,这Character只有一个责任:管理角色的状态,在传入的命令和游戏之间进行调解。 还有其他一些职责已经分解: Character具有Outgoing调用的,以为客户端应用程序生成传出更新。 Character有一个Timer跟踪下一次允许它做某事的时间。对此验证了传入的命令。 所以我的问题是,在SRP和类似原则下拥有如此大的课程是否可以接受?是否有任何最佳实践来减轻它的麻烦(例如,将方法拆分为单独的文件)?还是我错过了一些东西,真的有很好的方法将其拆分吗?我意识到这是非常主观的,希望获得其他人的反馈。 这是一个示例: class Character(object): def __init__(self): self.game = None self.health = 1000 self.successful_attacks = 0 self.points = 0 self.timer = Timer() self.outgoing = Outgoing(self) def load(self, db, id): self.health, self.successful_attacks, self.points = db.load_character_data(id) def save(self, db, id): db.save_character_data(self, health, self.successful_attacks, self.points) …

2
我应该将“计算”值公开为属性还是方法?
我有一个C#类,它表示Web内容管理系统中的内容类型。 我们有一个字段,允许Web内容编辑器输入HTML模板以显示对象的显示方式。它基本上使用把手语法将对象属性值替换为HTML字符串: <h1>{{Title}}</h1><p>{{Message}}</p> 从类设计的角度来看,我应该将格式化的HTML字符串(带有替换)作为属性或方法公开吗? 作为属性的示例: public class Example { private string _template; public string Title { get; set; } public string Message { get; set; } public string Html { get { return this.ToHtml(); } protected set { } } public Example(Content content) { this.Title = content.GetValue("title") as string; this.Message …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.