问题标签 [object-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 投票
8 回答
744 浏览

oop - 当状态不可变时,静态类是否合适?

假设我有一个名为的简单类WebsterDictionary,它有一个可以接受一个词并返回其定义的函数。也许还有另一个函数可以接受定义并返回一个单词。该类一直被许多客户使用。

为了便于查找,该类包含一个成员变量,它是一个内存字典,用于存储单词及其相关定义。假设字典一旦被初始化就永远不会改变——它是恒定的并且不会因实例而变化。

这是静态类的好人选吗?我一直在读静态类应该是无状态的......但是这个类有状态(内存字典)对吗?

编辑:另外,如果这确实成为一个静态类,我什么时候初始化 Dictionary 因为不再有构造函数?每次调用其中一个静态方法时,我是否会检查对 Dictionary 的引用是否为空?

谢谢。

0 投票
4 回答
595 浏览

c# - 关于 Linq 到 SQL 映射对象设计的建议

我希望标题和以下文字清楚,我对正确的术语不是很熟悉,所以如果我有任何错误,请纠正我。我第一次使用 Linq ORM,想知道如何解决以下问题。

假设我有两个数据库表:

Linq 代码生成器生成一堆实体类。

然后我编写自己的类和接口来包装这些 Linq 类:

到目前为止,一切都很好。

现在很容易找到用户的电话,Phones.Where(p => p.User = user)但 API 的消费者肯定不需要编写自己的 Linq 查询来获取数据,所以我应该将此查询包装在某个函数或属性中。

所以问题是,在这个例子中,你是否会向 IUser 添加一个 Phones 属性?

换句话说,我的界面应该专门为我的数据库对象建模(在这种情况下,电话不属于 IUser),还是它们实际上只是提供一组在概念上与用户相关联的函数和属性(在这种情况下,它做)?

两种观点似乎都有缺点,但我想知道是否有解决问题的标准方法。或者只是您可以分享的任何一般的智慧之词。

我的第一个想法是使用扩展方法,但实际上这在这种情况下不起作用。

0 投票
4 回答
456 浏览

c# - 对象设计:如何组织/构建“集合类”

我目前正在努力理解我应该如何组织/构建我已经创建的类。该类执行以下操作:

  1. 作为构造函数中的输入,它需要一组日志
  2. 在构造函数中,它通过一系列实现我的业务逻辑的算法来验证和过滤日志
  3. 在完成所有过滤和验证后,它会返回有效和过滤日志的集合(列表),这些日志可以在 UI 中以图形方式呈现给用户。

这是一些描述我正在做的事情的简化代码:

但是,为了访问此集合,我必须执行以下操作:

其他关键输入:

  1. 我预见应用程序中只存在这些过滤集合中的一个(因此我应该将其设为静态类吗?或者可能是单例?)
  2. 创建对象的可测试性和灵活性很重要(也许因此我应该将其保留为可测试的实例类?)
  3. 如果可能的话,我宁愿简化日志的取消引用,因为实际的变量名称很长,并且需要大约 60-80 个字符才能获取实际数据。
  4. 我试图保持这个类简单是这个类的唯一目的是创建这个经过验证的数据集合。

我知道这里可能没有“完美”的解决方案,但我真的很想通过这种设计来提高我的技能,我非常感谢这样做的建议。提前致谢。


编辑:

感谢所有回答者,Dynami Le-Savard 和 Heinzi 都确定了我最终使用的方法 - 扩展方法。我最终创建了一个 MyLogsFilter 静态类

我可以通过这样做在代码中创建一个只读集合

0 投票
4 回答
880 浏览

c# - 具有通用结构的 C# 类设计

这可能是一个简单的,但我的头拒绝围绕它,所以在这种情况下外部视图总是有用的!

我需要设计一个对象层次结构来为患者实现参数注册。这将在某个日期发生并收集有关患者的许多不同参数(血压、心率等)。这些参数注册的值可以是不同的类型,例如字符串、整数、浮点数甚至是 guid(用于查找列表)。

所以我们有:

更新:多亏了这些建议,该模型现在已演变为以下内容:

这确实有点简单,但现在我想知道,由于 ParameterRegistration 中的 IList 指向抽象的ParameterRegistrationValue 对象,我将如何获取实际值(因为它存储在子对象上)?

也许整个通用的东西确实不是完全可以走的路:s

0 投票
4 回答
116 浏览

php - PHP 面向对象问题

是否可以要求 PHP 5.3 中的对象包含某些常量或属性?我读了一点关于 PHP 的接口模型,它似乎只适用于抽象的公共方法,所以这是正确的。所以我要问的是是否有办法拥有两个对象对象 A 和对象 B。如果对象 B 想要扩展对象 A,它必须包含一个特定的常量或变量。你会如何设计这种类型的架构?谢谢。

0 投票
3 回答
1175 浏览

java - ByteArrayOutputStream 的公共接口的设计理由?

有许多 java 标准和 3rd 方库,在它们的公共 API 中,有写入或读取Stream. 一个例子是javax.imageio.ImageIO.write()OutputStream处理过的图像的内容写入其中。另一个例子是iText pdf 处理库,它将OutputStream生成的 pdf 写入其中。第三个示例是 AmazonS3 Java API,InputStream它将读取它并在S3 存储中创建文件。

当您想将其中两个结合起来时,就会出现问题。例如,我有一个图像BufferedImage,我必须使用它ImageIO.write来将结果推送到OutputStream. 但是没有直接的方法将它推送到 Amazon S3,因为 S3 需要InputStream.
解决这个问题的方法很少,但这个问题的主题是ByteArrayOutputStream.

背后的想法ByteArrayOutputStream是使用包装的中间字节数组,Input/Output Stream以便想要写入输出流的人将写入数组,而想要读取的人将读取数组。

我想知道为什么ByteArrayOutputStream不允许在不复制字节数组的情况下对其进行任何访问,例如,提供一个InputStream可以直接访问它的字节数组。访问它的唯一方法是调用toByteArray(),这将复制内部数组(标准数组)。这意味着,在我的图像示例中,我将在内存中保存三个图像副本:

  • 首先是实际的BufferedImage
  • 其次arrayOutputStreamand的内部
  • 第三个是由我制作的副本,toByteArray()所以我可以创建 InputStream.

这种设计如何合理?

  • 隐藏实现?只需提供getInputStream(),实现保持隐藏。
  • 多线程?ByteArrayOutputStream无论如何都不适合多线程访问,所以这是不可能的。

此外,ByteArrayOutputStreamApache 的commons-io库(具有不同的内部实现)提供了第二种风格的 . 但是两者都具有完全相同的公共接口,不提供不复制就访问字节数组的方法。

0 投票
3 回答
1427 浏览

c# - 在 C# 中为数据库外键建模

我正在创建一个日历应用程序。我有一个约会表和一个人表。这 2 个由每个表中的 PersonID 字段链接。

我的问题是,如果我的底层 .Net Appointment 对象包含 PersonName 的属性,并且我从数据库视图(或连接表的存储过程)填充对象,还是让 Appointment 类包含 People 类更正确? 如果答案是后者,那么从数据库中填充 Appointment/Person 对象的最佳方法是什么?

0 投票
1 回答
483 浏览

javascript - 组合对象时如何避免名称冲突

在 JavaScript 中,您可以使用某种extend函数来组合对象。

例如,我可能有一个公开observable一组公共方法(、、、、、、等)的类getpushsetincrementget

在这种情况下,observable 也恰好是一个 EventEmitter,因此它还公开了一组进一步的公共方法(emitonremoveListener等)

这两个类都具有存储状态的内部下划线前缀属性。eventemitter 用于_events存储事件处理程序,observable 用于存储 state_state_idid。

现在,当我像这样使用对象组合创建模型时

这会导致一个问题,因为Observable已经使用了_state内部属性并且现在存在名称冲突。

我认为仅仅“必须知道”哪些对象依赖于 mixin 的哪些内部属性才能安全工作,这很丑陋。

如何避免混合使用相同内部属性名称的两个对象?

理想情况下,这将通过 ES6 私有名称来解决,但我们还不能这样做,而且我们不能在不损失性能的情况下模拟它们。除非您可以提供不会造成很大性能损失的 ES6 名称仿真,否则我对这些解决方案不感兴趣。

另一种方法是使用闭包,或者bind您将为每个实例重新创建函数,这会导致显着的性能损失。另一种选择是将命名空间内部属性作为__eventEmitter_events__observable_state。这很丑陋,并且减少了命名空间冲突的可能性,它不会删除它。

0 投票
2 回答
304 浏览

vb.net - vb.net - 继承类的对象聚合

我正在玩几个对象的组合。

我有两个课程(笔记和任务)。Task 类派生自 Note 类,因为任务是扩展的注释。

每个便笺都有一个属性Property Child as list (of note),因为可以将便笺或任务添加到现有便笺或任务中(因此,此“子”便笺可能是任务或便笺)

IE。

最后的子笔记对象实际上是一个任务,我怎样才能使这个聚合工作?我不在乎它是笔记还是任务,但我想释放基类或扩展类的功能。

我的直接想法是每个对象都需要有一个任务列表和一个笔记列表,但感觉可能有一个更优雅的解决方案。

有人对此有任何想法吗?

0 投票
4 回答
160 浏览

c++ - 传递(在构造函数中)一个指向包含它的类的指针是一个糟糕的设计,如果是这样,解决方案是什么

我经常遇到像这样的代码

这样做的原因是 m_member 可以从包含它的类中调用成员函数......也就是

我个人不喜欢它,因为我认为它是可悲的设计(“亲爱的孩子,你知道你对你的类封装做了什么”),但我想知道这种行为通常是不好的,如果是的话如何避免这种设计。

编辑:请不要在初始化列表中关注这个,假设它在 ctor 正文中。