问题标签 [class-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
694 浏览

c++ - 用于两个以上继承级别的非虚拟接口习惯用法?

非虚拟接口习惯用法描述了虚拟方法如何成为非公共定制点,而公共方法是非虚拟的,以允许基类始终控制定制点的调用方式。

这是一个优雅的习惯用法,我喜欢使用它,但是如果派生类本身就是一个基类,它是如何工作的

0 投票
7 回答
894 浏览

c++ - 类设计与 IDE:非成员非友元函数真的值得吗?

在(否则)优秀的书C++ 编码标准第 44 条,标题为“Prefer writing nonmember nonfriend functions”中,Sutter 和 Alexandrescu 建议只有真正需要访问类成员的函数本身就是该类的成员。仅使用成员函数可以编写的所有其他操作不应该是类的一部分。他们应该是非会员和非朋友。论据是:

  • 它促进了封装,因为需要访问类内部的代码更少。
  • 它使编写函数模板更容易,因为您不必每次都猜测某个函数是否是成员。
  • 它使类保持较小,从而使其更易于测试和维护。

虽然我看到了这些参数的价值,但我看到了一个巨大的缺点:我的 IDE 无法帮助我找到这些函数!每当我有某种对象时,我想看看它上面有哪些可用的操作,我不能再只输入“ pMysteriousObject->”来获取成员函数的列表。

保持简洁的设计最终是为了让您的编程生活更轻松。但这实际上会使我的工作更加困难。

所以我想知道这是否真的值得麻烦。你怎么处理?

0 投票
8 回答
579 浏览

class-design - 类结构模式问题。我应该选择什么?

什么是(如果有的话)隐含的假设或限制以及设计的差异,例如:

在他的:

B)与此相比:

我知道这取决于具体的项目,但是如果上面的类是一个小框架的一部分呢?第一类能够更自然地维护状态并分离步骤,但第二类确保与外部调用者更自然的“实时通信”,因为每次调用 doWork() 时都会传递 Worker。

是否有任何推荐的用法或通用做法来指导上述两种方式之间的选择?谢谢。

0 投票
6 回答
629 浏览

oop - OO 与分层;平衡“OO 纯度”与完成任务

我相信 OO,但不至于应该使用不适当的设计/实现来实现“OO 兼容”。

那么,如何应对 Serlvet/EJB/DataContainer 分层架构:

  • Servlet 接收请求并调用“业务层”(例如会话 EJB)
  • 业务层从数据库中定位DataContainers并对其进行操作以实现业务逻辑
  • DataContainers 不包含真正的代码,只是获取/设置对应于数据库。

这种方法很有吸引力;DataContainers 清楚地知道它们的作用,并且很容易知道数据的来源。

除了不是 OO 之外,这还会导致业务层类不清楚,难以命名和组织。

即使我们试图更加“OO”(例如,将其中一些方法放在 DataConatiners 中),其中一些操作对不止一组数据进行操作。

您如何防止业务层变得混乱,但又不会用业务逻辑污染您的 DataContainer?

例子

  • 我们不想要validateUserName用户,因为它只对名称进行操作;我想它可以进入另一个类,但是我们有另一个程序“uti”类型类
  • 我们不希望在 User 上使用持久化方法,因为将数据结构与其持久化策略解耦是有价值的
  • 我们不希望 Servlet 中包含业务逻辑,因为我们可能需要在其他地方重用该逻辑
  • 我们不希望我们的业务逻辑在我们的用户中,因为这对用户类有太多的吸引力,使得业务逻辑的重用变得困难,并将用户与其持久性策略相耦合

我意识到这个例子并没有那么糟糕,但是想象一下 10 个 DataContainers 和 20 个 BizLayer 对象,每个对象都有几个方法。想象一下,其中一些操作并非“以”特定数据容器为中心。

我们如何防止这成为程序上的混乱?

0 投票
7 回答
274 浏览

oop - 建模相关对象

我正在设计一个处理两组数据的应用程序——用户和区域。数据是从第三方生成的文件中读取的。我有一个用户类和一个区域类,数据被读入一个用户数组和一个区域数组(或其他适当的内存结构,取决于我们采用的技术)。

这两个类都有一个从文件中读取的唯一 ID 成员,并且 User 类包含一组区域 ID,给出一个用户与多个区域相关联的关系。

要求非常简单:

  • 用户列表
  • 地区列表
  • 指定区域用户列表
  • 指定用户的区域列表

我的第一个想法是将数据留在两个数组中,然后对于每个要求,有一个单独的方法可以根据需要询问一个或两个数组。这很容易实现,但我不相信它一定是最好的方法。

然后我考虑在 User 类上有一个“Get Areas”方法,在 Area 类上有一个“Get Users”成员,这会更有用,例如,如果我正处于我有一个 Area 对象的阶段,我可以找到它是一个属性的用户,但是 Area 类上的“获取用户”方法如何知道/有权访问用户数组。

我之前遇到过这个问题很多次,但从来没有真正想出一个明确的解决方案。也许我只是让它比实际情况更复杂。任何人都可以提供任何可以帮助我进行此类设计的提示、URL 或书籍吗?

更新:感谢大家花时间留下一些提示。非常感谢您的意见。

我同意这个问题的根源是多对多关系。我了解如何在关系数据库中对其进行建模,这非常简单。

我收到的数据是来自第三方的二进制文件的形式,所以我无法控制这些文件的结构,但我可以在读取时以最好的方式存储它。它有点像圆形的钉子漏洞,但我认为将其读取然后将其存储在数据库中,然后程序将不得不查询数据库以获取结果。这不是大量的数据,所以我认为可以通过将其存储在内存结构中来获取我需要的内容。

0 投票
4 回答
2214 浏览

class-design - 我应该如何将大而臃肿的类拆分成更小的类?

我有一个大型的“经理”类,我认为它做得太多,但我不确定如何将它划分为更多的逻辑单元。

一般来说,该类基本上由以下方法组成:

Manager 类是我的业务逻辑的一部分,它在数据访问级别包含另一个“Manager”类的实例,其中包含所有实体的所有 CRUD 操作。

我有来自数据访问层的不同实体,因此在 Manager 类之外有一个转换器来将数据实体转换为业务实体。

管理器类的原因是我希望在进行单元测试时能够模拟每个“管理器”类。每个管理器类现在都超过 1000 个 loc,每个包含 40-50 个方法。我认为它们非常臃肿,并且发现将所有数据访问逻辑放在一个类中很尴尬。我应该做些什么不同的事情?

我将如何拆分它们,我应该使用任何特定的设计模式吗?

0 投票
6 回答
4617 浏览

design-patterns - 将算法封装到一个类中

我想知道将算法封装到一个类中有多常见?更具体地说,不是有许多单独的函数在彼此之间转发公共参数:

将公共参数封装到一个类中,并在构造函数中完成所有工作:

不必通过函数参数转发公共参数和中间结果似乎非常实用。但我还没有看到这种“模式”被广泛使用。可能的缺点是什么?

0 投票
6 回答
1391 浏览

c++ - 类中带有指针的垃圾,C++

我正在使用 Borland Builder C++。我有内存泄漏,我知道这一定是因为我创建了这个类,但我不知道如何修复它。请查看我的代码——任何想法将不胜感激!

这是.h文件:

这是一些 .cpp 文件:

现在,当我在 main 中使用该类时,基本上我只是创建了一个指针:

其中corners->location 是另一个类的字符串,t[5] 和 t[6] 都是字符串。问题是 imageLocation 不包含预期的内容,而且通常只是垃圾。我已经阅读了很多关于内存泄漏和指针的内容,但我对编程仍然很陌生,其中一些内容相当混乱。任何建议都会很棒!

0 投票
8 回答
345 浏览

design-patterns - 类数据职责

我有一个“采购订单”课程。它包含有关单个采购订单的信息。我有一个用于数据库方法的 DAO 类。

负责加载和更新采购订单的方法的责任在哪里?

PurchaseOrder 类是否应该具有直接使用 DAO 类的“.update”、“insert”、“delete”和“.load”方法,或者 PurchaseOrder 类是否应该不了解 DAO 方法并具有管理这些方法的 POController 类互动?

用户一次只能处理一个 PurchaseOrder。

谢谢!

0 投票
6 回答
1893 浏览

c++ - 使用矢量作为私有/公共成员的类设计?

将容器类或其他类作为私有或公共成员放入类中的最佳方法是什么?

要求:

1.Vector< someclass> 在我的班级里

2.需要向量的添加和计数接口