Questions tagged «class-design»

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

4
面向对象的编程:getter / setter或逻辑名
我目前正在考虑要编写的类的接口。此类包含字符的样式,例如,字符是否为粗体,斜体,带下划线等。我已经辩论了两天,是否应该将getter / setter或逻辑名用于将值更改为这些样式。尽管我倾向于使用逻辑名称,但这确实意味着编写的代码效率不高,逻辑也不如逻辑。让我举一个例子。 我有一类CharacterStyles具有成员变量bold,italic,underline(和其他一些人,但我会留下来,以保持它的简单)。允许程序其他部分访问这些变量的最简单方法是编写getter / setter方法,以便您可以执行styles.setBold(true)和styles.setItalic(false)。 但是我不喜欢这样。不仅是因为很多人说吸气剂/装料剂破坏了封装(真的那么糟糕吗?),而且主要是因为它对我而言似乎不合逻辑。我希望通过一种方法styles.format("bold", true)或类似方法来设置角色的样式,但不能通过所有这些方法来设置样式。 不过有一个问题。由于您无法通过C ++中的字符串内容访问对象成员变量,因此我要么必须为所有样式编写一个大的if语句/开关容器,要么必须将样式存储在关联数组中(地图)。 我不知道什么是最好的方法。我想我应该写吸气剂/设定器,下一刻我倾向于另一种方式。我的问题是:你会怎么做?为什么要这么做?

3
应该如何设计“员工”类?
我正在尝试创建一个用于管理员工的程序。但是,我无法弄清楚如何设计Employee课程。我的目标是能够使用Employee对象在数据库上创建和操作员工数据。 我想到的基本实现就是这样一个简单的实现: class Employee { // Employee data (let's say, dozens of properties). Employee() {} Create() {} Update() {} Delete() {} } 使用此实现,我遇到了几个问题。 该ID雇员是由数据库给出的,所以如果我使用描述的新雇员的对象,不会有ID存储然而,当代表现有员工的对象将有一个ID。因此,我有一个属性,它有时描述对象,有时却不描述(这可能表明我们违反了SRP?因为我们使用同一类来表示新员工和现有员工...)。 该Create方法应该在数据库上创建一个雇员,而Update和Delete应该作用于现有雇员(再次,SRP ...)。 “创建”方法应具有哪些参数?所有员工数据或Employee对象的数十个参数? 班级应该是一成不变的吗? 会如何Update工作?是否需要属性并更新数据库?还是需要两个对象-一个“旧”对象和一个“新”对象,并使用它们之间的差异更新数据库?(我认为答案与该类的可变性有关)。 建设者的责任是什么?它需要什么参数?它会使用id参数从数据库中获取员工数据并填充属性吗? 因此,如您所见,我的头有些乱,我非常困惑。您能否帮助我了解此类课程的外观? 请注意,我只是为了了解通常如何设计这种经常使用的类而不想发表意见。

2
仅具有一个实例的Python类:何时创建(单个)类实例以及何时使用该类?
给定一个仅实例化一次的Python类,即该类中只有一个对象。我想知道在什么情况下创建单个类实例而不是直接与该类一起工作才有意义。 有一个类似的问题,但重点不同: 它是关于将全局变量和函数分组为一个类, 它不是特定于Python的。后者意味着它不考虑(在Python中)类也是对象的事实。 更新: 在Python中,我可以对类和对象执行以下操作: class A(object): pass A.some_state_var = True # Then later A.some_state_var = False my_a = A() my_a.some_state_var = True # Then later my_a.some_state_var = False 因此,我看不到在类和该类的实例之间进行选择如何与状态有关(在Python中)。我可以通过两者之一来保持状态。 此外,创建我的类/类实例的动机与执行Singleton要求无关。 另外,创建新的Type并不需要太多。 这样做的动机是将相关的代码和数据进行分组,并为其提供接口。这就是为什么我最初在类图中将其建模为类的原因。仅当涉及到实现时,我才开始怀疑是否要实例化此类。

2
关于静态班级和成员的思想和最佳实践
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我对有关静态成员或整个静态类的想法和行业最佳实践感到很好奇。这有什么弊端,或者它参与任何反模式? 我将这些实体视为“实用程序类/成员”,从某种意义上说,它们不需要或不需要实例化该类来提供功能。 关于此的一般想法和行业最佳实践是什么? 请参阅下面的示例类和成员,以说明我所引用的内容。 // non-static class with static members // public class Class1 { // ... other non-static members ... public static string GetSomeString() { // do something } } // static class // public static class Class2 { // ... other static members ... public …
11 c#  class-design 

4
对数据对象使用依赖注入?
我只是在学习有关依赖项注入的知识,并且陷入了困境。依赖注入建议通过构造函数发送依赖类,但是我想知道对于数据对象是否需要这样做。由于单元可测试性是DI的主要优点之一,因此仅存储数据而不对任何过程进行数据测试的数据对象都会使DI成为不必要的复杂性层,或者它甚至仍然有助于显示依赖性与数据对象? Class DO{ DO(){ DataObject2List = new List<DO2>(); } public string Field1; public string Field2; public List<DO2> DataObject2List; } Class DO2{ public DateTime Date; public double Value; }

2
在哪里为我的班级建立公共数据库连接
我有几个类(资源库),它们负责在数据库中保存/检索某些对象的任务。它们都需要与一个数据库建立连接。 我认为为了避免在每个类中重新定义ConnectionString和SqlConnection,将开放的连接传递给它们。那么定义/打开该连接并将其传递给类的最佳位置/时间在哪里/何时? 是否有更好的方法/模式可以访问此公共资源?
11 c#  sql  class-design 

5
如何解决我的C ++代码中的类相互依赖性?
在我的C ++项目中,我有两个类,Particle和Contact。在Particle该类中,我有一个成员变量std::vector<Contact> contacts,其中包含Particle对象的所有触点以及相应的成员函数getContacts()和addContact(Contact cont)。因此,在“ Particle.h”中,我包括“ Contact.h”。 在Contact该类中,我想将代码添加到构造函数中Contact,以调用Particle::addContact(Contact cont),以便contacts针对Particle在其间Contact添加对象的两个对象进行更新。因此,我必须在“ Contact.cpp”中包含“ Particle.h”。 我的问题是这是否可接受/良好的编码习惯,如果不能,那么哪种更好的方式来实现我要实现的目标(简单地说,每当有新联系人时,自动更新特定粒子的联系人列表)被建造)。 这些类别将由Network具有N个粒子(std::vector<Particle> particles)和Nc个接触(std::vector<Contact> contacts)的类别联系在一起。但是我希望能够拥有类似的功能particles[0].getContacts()– Particle在这种情况下可以在类中使用这样的功能,还是为此目的在C ++中有更好的关联“结构”(在另一个类中使用两个相关类) 。 在此方面,我可能需要转变看法。由于这两个类是由一个Network类对象连接的,因此典型的代码/类组织是具有完全由该Network对象控制的连接信息(因为Particle对象不应知道其联系,因此,它不应具有getContacts()成员)功能)。然后,为了知道特定粒子具有什么接触,我将需要通过Network对象(例如使用network.getContacts(Particle particle))获得该信息。 具有粒子粒子知识的C ++类设计是否也不太典型(也许甚至不鼓励),也就是(具有通过网络对象或粒子粒子访问信息的多种方式),无论哪种方式看起来更方便)?

5
接口和继承:两全其美?
我“发现”了界面,并开始喜欢它们。接口的优点在于它是一个契约,任何需要履行该契约的对象都可以在需要该接口的任何地方使用。 接口的问题是它不能具有默认实现,这对于平凡的属性是一种痛苦,并且会破坏DRY。这也很好,因为它可以使实现与系统保持分离。一方面,继承会保持更紧密的耦合,并且有可能破坏封装。 案例1(与私有成员的继承,良好的封装,紧密耦合) class Employee { int money_earned; string name; public: void do_work(){money_earned++;}; string get_name(return name;); }; class Nurse : public Employee: { public: void do_work(/*do work. Oops, can't update money_earned. Unaware I have to call superclass' do_work()*/); }; void HireNurse(Nurse *n) { nurse->do_work(); ) 情况2(只是一个接口) class IEmployee { virtual …

2
扩展类以重用单个函数是否合理?
我正在为wordpress网站开发一系列的帖子过滤器,并且已经用一个类构建了前四个。 最后两个在作用域上有足够的不同,以使其类中仅共享一个函数(用于产生最终链接的函数)。 在这种情况下或在任何数量的类似假设情况下,扩展原始类以具有该功能是否合理,还是有更好的方法?

5
您可以拥有“空”的摘要/类吗?
当然可以,我只是想知道以这种方式进行设计是否合理。 我正在制作突破克隆,并正在进行一些类设计。我想使用继承(即使不是必须的)来应用我在C ++中学到的知识。我当时正在考虑类的设计,并想出了这样的东西: GameObject->基类(由x和y偏移量等数据成员以及SDL_Surface *向量 组成:MovableObject:GameObject->抽象类+ GameObject的派生类(一个方法void move()= 0;) NonMovableObject:GameObject->空类...除了构造函数和析构函数外,没有方法或数据成员(至少现在是这样?)。 后来我打算从NonMovableObject派生一个类,例如Tileset:NonMovableObject。我只是想知道是否经常使用“空”抽象类或只是空类...我注意到我这样做的方式,我只是为了分类而创建NonMovableObject类。 我知道我只是想做一个突破性克隆而已,但我的重点不在游戏上,而是在使用继承和设计某种游戏框架上。

4
重命名方法可以保留封装吗?
我正在阅读此页面,了解何时需要使用getter / setter,并且OP提供了以下代码示例: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void go_shopping(Fridge fridge) { fridge.set_cheese(fridge.get_cheese() + 5); } 该接受的答案状态: 顺便说一句,在你的榜样,我会给类Fridge的 putCheese()和takeCheese()方法,而不是get_cheese() 和set_cheese()。这样您将仍然具有封装。 如何封装从对get / set重命名它来保存putCheese()/ takeCheese()你显然获取/设置一个值,那么为什么不干脆把它作为对get / set? 在相同的答案中,它还指出: 拥有getter和setter方法本身并不会破坏封装。破坏封装的方法是自动为每个数据成员(Java术语中的每个字段)添加一个getter和setter,而无需考虑任何问题。 在这种情况下,我们只有一个变量,cheese并且您可能想将奶酪拿回冰箱,所以在这种情况下,一对get / set是合理的。

5
太多的抽象使得代码难以扩展
我在代码库中感觉到太多抽象(或者至少是处理它)时遇到了问题。代码库中的大多数方法已被抽象为采用代码库中最高的父级A,但是此父级的子级B具有新属性,该属性会影响其中某些方法的逻辑。问题在于这些属性无法在那些方法中检查,因为输入被抽象为A,而A当然没有此属性。如果我尝试创建一个新的方法来不同地处理B,则会被调用以进行代码复制。我的技术负责人的建议是创建一个使用布尔参数的共享方法,但是这样做的问题是,有些人将其视为“隐藏的控制流”,其中共享方法具有的逻辑对于将来的开发人员可能并不明显。 ,并且即使需要添加将来的属性,即使将其分解为较小的共享方法,该共享方法也会变得过于复杂/复杂。这也增加了耦合,降低了凝聚力,并且违反了我团队中有人指出的单一责任原则。 本质上,此代码库中的许多抽象有助于减少代码重复,但是当使它们采用最高抽象时,这会使扩展/更改方法变得更加困难。在这种情况下我该怎么办?尽管其他人不能就他们认为的好事达成共识,但我还是要怪罪于我,这最终伤害了我。

4
如何反对业务对象类设计的这种“完全公开”的思维方式
我们做了很多的单元测试,我们的业务对象的重构,而我似乎有很对类设计比其他同龄人不同的意见。 我不喜欢的示例类: public class Foo { private string field1; private string field2; private string field3; private string field4; private string field5; public Foo() { } public Foo(string in1, string in2) { field1 = in1; field2 = in2; } public Foo(string in1, string in2, string in3, string in4) { field1 = …

6
字段与方法参数
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我刚开始写一些新的类,然后发现我添加了很多严格不需要的方法参数。这是为了避免在某些方法调用特定的类中具有状态,而不是成为类的常规配置或依赖性,这是一种习惯。 这样做意味着许多没有参数的方法最终只能得到一,二或三。 我想听听您对这个折衷方案的看法,以及如何决定在何种情况下采取哪种方法? 由于在描述代码时,代码通常比英语更容易理解,因此我创建了一个包含两个变体的小知识点:https : //gist.github.com/JeroenDeDauw/6525656

5
我们怎么知道偏爱合成而不是泛泛总是正确的选择?
无论对象是否物理存在,我们都可以选择以不同方式对其进行建模。在许多情况下,我们可以随意使用归纳或组合。但是,GoF的“偏爱组合胜于一般化”原则指导我们使用组合。因此,例如,当我们对一条线进行建模时,我们将创建一个包含两个类型为Point(组成)的PointA和PointB成员的类,而不是扩展Point(广义化)。这只是我们可以随意选择合成或继承进行建模的简化示例,尽管对象通常要复杂得多。 我们怎么知道这是正确的选择?至少很重要,因为如果做错了,可能要进行大量的重构?
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.