问题标签 [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 投票
4 回答
597 浏览

c++ - 通过引用让孩子访问父母的成员 - 可以吗?

C++ 新手问题。请确认我做对了。

我有一个全球应用程序类产生它的小孩,我需要让孩子们访问一些应用程序设施。所以我决定通过参考将它们传递给孩子们。

我测试了这个想法,如下所示。它似乎工作正常。我只是想确保我没有做危险的事情。可能有什么我忽略的陷阱吗?

爸爸创造了孩子并给了他们他的车钥匙:

0 投票
2 回答
256 浏览

c# - 从我的数据库中获取数据最干燥的方法是什么?

我必须编写一个 ASP.NET 应用程序来连接到我们的旧版 IBM Universe 数据库,并且我们正在使用一个名为 mv.net 的产品,它允许我们连接、读取、写入、选择、运行服务器端程序等。

我希望尽可能少的代码重复,但我也希望尽可能少的数据传输。

为了打开连接,我们必须首先使用以下代码获取对帐户的引用:

然后我们可以读取一个项目:

然后我们就完成了:

每个模块都有一个类,所以我可能有 INVOICE、PURCHASE_ORDER、RMA、REQ、SHIPMENT 等等。在 INVOICE 中,我可能需要访问多个表,例如 CUSTOMER、INVOICE、TERMS、SHIPVIA 等。

我计划做的是创建一个名为 TechDB 的类,它是我们数据库的名称,并将代码放在那里,所以在我的 INVOICE 类中我可以说:

当我这样做时,我的 TechDB 类将打开连接,读取记录,然后一步注销。

我想我正朝着正确的方向前进,但如果不是,请告诉我。这是我的问题:

  1. 如何在我的 INVOICE 类中返回错误?例如,如果我们无法连接到数据库、无法打开文件、无法读取记录,则可能会发生错误。

  2. 如果我需要从我的 INVOICE 中获取一些数据然后读取 TERMS 表怎么办。当我刚打开一个数据库时,我不想打开一个新的连接。

  3. 我应该在所有有这个的类上调用 Dispose 方法吗?例如,mvAccount 有一个 Dispose 方法。没有文档说要调用它,但是我应该在 Logout() 之后调用它吗?

  4. 我可以在执行 myAccount.Logout() 的 TechDB 类上创建一个 Dispose 方法吗?这样连接将保持打开状态,当我完全完成它时,我可以从我的 INVOICE 类中关闭它吗?

给我一些关于处理这个问题的最佳方法的意见?我的目标是一个健壮的应用程序,它易于修改并且代码重复尽可能少。

0 投票
2 回答
975 浏览

language-agnostic - 类设计:实体 ID 与实体引用

如果我的 Foo 具有 Bar 类型的属性。两者都保存在可以通过 ID 检索的数据库中。(ID 实际上是由客户服务声明在业务线中使用的。所以它们不仅仅是索引占位符。)我可以采用 b1 或 b2 所示的方法。

将实体链接在一起让我感到害怕,因为如果你把它推得太远,很容易让 Null 弹出。另一方面,让 ID 随处可见似乎增加了不必要的冗长。

注意:这与 .NET 实体框架无关。这里使用的词实体是一般意义上的。

0 投票
8 回答
4744 浏览

java - 如何动态创建类文件?

我想动态创建一个类文件。在这里... 使用给定的 ResultSet,提取元数据我想使用 ResultSet 中存在的所有列的 getter 和 setter 方法动态构建一个类文件。此外,我应该能够在以后使用的任何地方使用生成的这个类文件。任何机构都可以建议我更好的方法来实现这一点。此外,如果有任何现有的 jar 文件可用于实现这一点,那将很有帮助。

0 投票
12 回答
1765 浏览

oop - 如何打破我的程序编码习惯?

我最近阅读了一篇关于 OOP 相关问题的有趣评论,其中一位用户反对创建“Manager”类:

在谈论班级名称时,请从您的词汇表中删除单词管理器。类的名称应该描述其目的。经理只是垃圾场的另一个词。任何功能都适合那里。这个词一直是许多极其糟糕的设计的原因

这条评论体现了我成为一名优秀的面向对象开发人员的努力。我在一个只有程序编码员的组织里做程序代码已经很长时间了。似乎我们生成的相对较少的 OO 代码背后的主要策略是将问题分解为易于识别为离散单元的类,然后将剩余/通用位放入“管理器”类中。

我怎样才能打破我的程序习惯(比如 Manager 类)?大多数 OO 文章/书籍等使用的问题示例本质上很容易转换为对象组(例如,Vehicle -> Car),因此没有为分解更复杂的系统提供太多指导。

0 投票
3 回答
564 浏览

oop - 您如何在项目生命周期中保持对象模型图和代码实现同步?

在设计新的对象模型时,我总是从 Visual Studio 中的类图功能开始。一旦我起草了第一个版本,并根据收集新信息或需求变化进行了一些调整,我就开始着手实际实施。

随着开发变得忙碌并且必须满足目标,图表会被搁置一边,然后最终以与从一开始就设计的模型不同的模型结束。

您如何在项目生命周期中保持您的类对象模型和代码实现同步?

0 投票
8 回答
646 浏览

c++ - 同行之间的 C++ 友谊是否健康?

虽然阶级友谊是 C++ 的最后手段之一,但这种模式有意义吗?

好的,这种模式的原因是因为 Peers 都是相同级别的,他们需要相互共享知识,但是这个知识是秘密的,因为除了 peer 之外没有人应该使用它,或者程序不再有效.

一个非常真实的例子是,当一个对等点从另一个对等点复制构建时,它需要从其源对等点访问秘密信息,但同样没有理由让其他任何人知道这些内部结构,只有对等点。

0 投票
2 回答
270 浏览

oop - 是否存在确定方法或字段是否属于类的启发式方法?

我可以执行一个好的经验法则或测试来确定一个方法或字段是否属于一个类?如何识别成员何时不属于?

我发现我在面向对象设计中最大的绊脚石是试图弄清楚什么去哪里。答案似乎太多了:“它可以在这里那里。”

这是我正在努力解决的事情类型的一个简单示例:

ITDepartment对象管理 2 组……但它Employees应该知道Employees有技能吗?应该AddSkillToGroup重新定位这样的方法吗?

编辑:

到目前为止,似乎一致认为 IT 部门不应该了解员工的技能。我将扮演恶魔的拥护者,以说明我的困惑在哪里起作用。

ITDepartment 由两个 Employee 集合组成。它不应该能够委托给那些收集项目吗?AddSkill 方法仍然属于 Employee 类。IT 部门只是指示其员工组为其每个成员添加一项技能。

0 投票
13 回答
74825 浏览

c# - 您将如何在 Java 或 C# 中编写高效的循环缓冲区?

我想要一个实现固定大小的循环缓冲区的简单类。它应该是高效的、易于使用的、通用的类型。

目前它不需要支持 MT。以后总能加个锁,反正不会是高并发的。

方法应该是:.Add()我猜.List(),我在哪里检索所有条目。再三考虑,我认为应该通过索引器进行检索。在任何时候,我都希望能够通过index检索缓冲区中的任何元素。但请记住,从一个时刻到下一个 Element[n] 可能会有所不同,因为循环缓冲区会填满并翻转。这不是一个堆栈,它是一个循环缓冲区。

关于“溢出”:我希望内部会有一个包含项目的数组,并且随着时间的推移,缓冲区的头部尾部将围绕该固定数组旋转。但这对用户来说应该是不可见的。不应有外部可检测到的“溢出”事件或行为。

这不是学校作业——它最常用于MRU 缓存或固定大小的事务或事件日志。

0 投票
5 回答
211 浏览

asp.net - 何时最好使用新类而不是添加到现有类

我的 Web 应用程序的业务层中有一个名为 Player 的类。

Player 类具有 PlayerID、CategoryID 和 CountryID 字段

Player 类中的一个函数调用数据访问层中 PlayerDB 类中的一个函数,该函数又调用一个存储的过程,该过程从 Player 表中返回 PlayerID、CategoryID(Category 表的外键)和 CountryID(Country 表的外键)的数据.

我现在有一种情况,我想将 Country Name 和 Country Image(url 路径)添加到上述调用中,从 Country 表中返回每个 CountryID 的新字段。

我的问题是,我是否将国家名称和国家形象作为附加字段添加到 Player 类,或者我是否有名为 Country(BLL) 和 CountryDB(DAL) 的新类和一个新的存储过程?

我想做最好的做法,而不是最简单的方法。

如果它是相关的,我正在使用 ASP.NET、VB.NET 和 SQL2005。

正如您可能会告诉我的那样,我是一个新手,如果我没有在我的问题中使用正确的术语,请原谅我。我希望你能明白。