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

c++ - std::mutex 与 std::recursive_mutex 作为类成员

我看到有些人讨厌recursive_mutex

http://www.zaval.org/resources/library/butenhof1.html

但是在考虑如何实现一个线程安全的类(互斥锁保护)时,在我看来很难证明每个应该受互斥锁保护的方法都是互斥锁保护的,并且互斥锁最多被锁定一次。

因此,对于面向对象的设计,是否应该std::recursive_mutex默认并std::mutex在一般情况下将其视为性能优化,除非它仅用于一个地方(仅保护一种资源)?

为了清楚起见,我说的是一个私有的非静态互斥体。所以每个类实例只有一个互斥锁。

在每个公共方法的开头:

0 投票
2 回答
620 浏览

c++ - 组合类 C++ 中的冗余代码

我正在尝试学习 C++。一切都很顺利,直到我的“练习”计划遇到了很小的障碍。我相信,这个障碍源于设计问题。

想想二十一点(21)。我做了几节课。

  1. 卡片
  2. 甲板
  3. 播放器

一个甲板由 - 为简单起见 - 有一系列卡片组成。
-它可以显示所有卡片
-它可以洗牌
-它可以移除卡片

一手牌就是一副牌——它的好处是
——它可以计算它的手牌价值
——它可以把牌加到手上

现在来解决我的问题 - 播放器设计

-A Player Has A hand (private access)
我对玩家的问题是,那只手有一个名为 addCardToHand 的方法函数。如果我必须创建一个名为 addCardToHand(Card c) 的 Player 方法,在该方法中调用并传递给同一方法,我会感到一种冗余/糟糕的设计。

或者

将 Hand h 声明为可公开访问的成员,并在“main()”中执行类似于
Player p 的操作;
卡卡;
phaddCard(卡片);

任何建议都会很有启发性并受到高度赞赏。请记住,我正在学习。

0 投票
2 回答
116 浏览

oop - 尽量避免对不同班级的班级了解太多

我需要帮助设计我正在编写的应用程序。在应用程序中,员工可以在项目中预订他们的工作(所谓的预订对象)。预订对象可以有选择地具有预算。当预订对象的预算用尽时,员工不得在该预订对象上进行预订。

项目负责人应通过以下两种方式之一设置预算金额:

  1. 设置一个十进制数,代表一些货币金额
  2. 通过人工天数设置金额

例如,可以合法地说预订对象 X 的预算为 10,000 美元。同样合法的是,X 的预算包括高级人员 2.5 人日、初级人员 3 人日和支持人员 5.5 人日。在内部,人日金额计算为货币金额(高级价格的 2.5 倍 + 初级价格的 3 倍 + 支持价格的 5.5 倍)。man-day 金额在某种程度上是一个计算器,但它应该被持久化,所以不仅仅是 UI 的东西。

问题是如何在工日预算不了解预订对象太多的情况下将价格注入工日预算。每个预订对象的级别(“高级”、“初级”、“支持”等)允许有不同的价格。

我想出了以下课程。

货币金额和人日金额的两个特殊类别。

类的使用者现在可以编写如下内容:

为了方便起见,我已经给出Budget.Amount了具体类中属性的实现以及ManDay.

将要求应用程序中的其他对象也有预算。目前还不是很清楚。我应该如何设计我的课程,以便ManDayBudget对价格查找逻辑不太了解,最好对预订对象一无所知。我有一种感觉,我错过了一个进行计算的课程。

编辑:

明确消费者应该做什么和可以做什么:

预订对象 X ( ) 的金额bo_x.Budget.Amount可以是 7.600,Y 中的一个可以是 9.200,因为对于每个预订对象定义了不同的价格。消费者说这么多人工日预算,仅此而已。但是必须在没有太多关于 BookingObject 的知识的情况下以某种方式计算货币金额,以便以后重用该类。

编辑2:

X 可以将老年人的价格设置为 100、初级到 80 等,而 Y 可以将老年人的价格设置为 125、初级到 100 等。因此,即使人工天数也设置为相同的数量天两个预订对象的金额不同。

0 投票
2 回答
87 浏览

.net - 实体框架:具有关系等的对象设计

我有一个关于大学管理的 .net 解决方案(使用实体框架,使用 CodeFirst 方法)。项目的架构是这样的:

  • DataAccess(DbContext 和通用存储库)
  • 实体(代码第一类)
  • 服务(服务类)
  • Web(一个MVC项目,解释不重要)

为了使问题更容易,我将只讨论我域中的两个类(在实体层上):

  • 课程
  • 学生

课程可以有很多学生。解决方案的目标是将学生添加到课程中(中间有一些验证)。

课程.cs

如您所见,该类具有将学生添加到课程的属性。情况是验证越来越多,现在非常复杂,需要对数据库进行一些查询等等......所以课程有很多责任!

所以我想,我需要一项服务来处理“添加”并进行所有验证,并将这种责任从课程课程中拿走。问题是,由于Student CollectionCourse的私人成员,我无法将学生添加到 Service 类的课程中。

我认为解决问题的另一种方法是将相关实体(学生)添加到上下文(来自服务),但这会破坏我的存储库(因为我必须公开DbContext)。如果我直接使用 Service 类中的 DbContext,那么存储库就没有意义了,不是吗?

那么,我应该如何设计呢?或者我应该怎么做才能解决这个问题?任何建议也会很受欢迎!

谢谢!

0 投票
1 回答
462 浏览

.net - TDD 和 CodeFirst(实体框架)

这个问题不是关于如何测试数据访问,也不是关于存储库。这是关于我想在项目中使用我的 POCO 类(我用 TDD 制作的)时遇到的问题。我的意思是,这是由于 Linq to Entities 限制的问题(或者可能是我关于类设计的问题)。

我通过 TDD 学习的课程是下一个(当然,非常简化):

很简单,对吧?

那么……那有什么问题呢?让我们看看......当我想从数据库中检索课程中的所有数据(课程类在现实模型中有很多子集合)对它们应用过滤器时,我能做到的唯一方法是这样的:

如您所知,由于GetGreatStudents()函数,它会返回错误:

LINQ to Entities 无法识别方法 [...] 此方法无法转换为存储表达式。

我的意思是,我知道我可以直接用.Where(n => n.Average > 8)替换该方法,但它很糟糕(实际上有很多过滤器),这样,有什么意义如果我不能使用我已经构建和测试过的 api,使用 TDD?

所以,我的问题是,对于那些有 TDD 和实体框架开发经验的人,当你使用 Linq to Entities 时,如何才能使用你通过 TDD 设计的漂亮 API?

0 投票
2 回答
4292 浏览

python - Python 中的@property 速度开销

我试图了解 Python 中 @property 装饰器的实用性。具体来说,我使用如下属性设置了一个类:

我还设置了一个没有提供相同功能的属性的类:

我为每个创建一个实例:

在 iPython 中运行 %timeit 会产生以下结果

1000000 次循环,3 次中的最佳:每个循环 213 ns

10000000 次循环,3 次中的最佳:每个循环 67.9 ns

1000000 次循环,3 次中的最佳:每个循环 257 ns

10000000 次循环,3 次中的最佳:每个循环 89.7 ns

显然,@property 和 @setter 装饰器在你与对象交谈的频率很高时效果较差。我的问题很简单,为什么要使用它?我很想听听人们可能拥有的这些装饰器的任何用例。谢谢。

0 投票
1 回答
82 浏览

oop - 决定设计类接口

我想从其他人那里得到一些关于以下问题的想法。假设我们有两个类 Products 和 Items。Products 对象允许我们访问任何 Item 对象。这是示例。

现在更新/保存项目状态的最佳方法是什么?我看到 2 个选项:

或者

第一种方法似乎非常直接。一旦设置了 Item 对象的属性,对其调用 save 方法将持续更改。

另一方面,我觉得后一种方法更好。我们将两个对象的角色分开。Item 对象仅包含状态, Products 对象在该状态上运行。此解决方案也可能更适合编写单元测试。有什么想法吗?

0 投票
1 回答
53 浏览

c++ - 强制派生类而不再次实现纯虚拟

我已经定义了一个接口类A,它定义了一些基本功能。在我的实现中,我有一个A0实现此接口的基类,并且从这个基类中我派生了层次结构中的其他几个类。

如您所见,我定义了一个IContainerReader和一个IContainerWriter类,该类定义了仅与相应实现相关的特殊功能。

但是现在我遇到了一个问题,因为我想确保 Reader 或 writer 也始终拥有容器库。因此,合乎逻辑的解决方案是IContainerReader/-WriterIContainer. 但是当我这样做时,thge 编译器会抱怨,因为它希望现在一个Reader/Writer对象也再次实现基函数,这些基函数已经通过基类定义。但是,如果我让IContainerReader不从IContainer指向这些对象之一的指针派生,则不能保证也具有该IContainer功能。

如果我尝试像这样编译它,我会得到错误,因为IContainerReader不是IContainer

但是,如果我按原样派生IContainerReader,则会收到以下错误:IContainer

所以编译器希望我在派生类中从基类中重新定义所有函数。

那么有没有解决方案,而不必再次在 Reader/Writer 类中定义所有这些函数?当然,我可以实现只下到基类的假人,但我认为这有点笨拙和不必要的开销,我希望可能有更好的解决方案。

0 投票
2 回答
194 浏览

python - 如何在 python 中创建嵌套的生成器结构?

我正在尝试创建一个ImageSeries对象,我想在其中以某种模式检索图像(对于 xy 中的每个值和 z 中的每个值),并且我调用将生成器附加到任务列表的方法,然后运行生成器通过两个 for 循环来做到这一点。

但是在第一个任务的第一次迭代之后,我的第二个任务就筋疲力尽了,这不是我想要的结果。我希望第二个任务运行第一个任务的每次迭代。

我想知道是否有有效的方法来编写这样的模式。

电流输出:

预期输出:

0 投票
0 回答
12 浏览

object - 对象列表或列表/映射作为对象属性的设计选择,适用于以下情况

我正在使用 Flutter/Dart 但这确实是我对所有语言都有的基本 OOP 问题。
我正在寻找一个答案,告诉我以下哪些设计具有最好的资源管理和最简单的编码。

这个类似的帖子并不能真正让我满意,我觉得我需要一个更好的黑白答案,可以辨别这两种设计。

情况一
一个很少修改的对象,它被创建一次,但经常阅读,很少更新

情况二 一个访问量很大的对象——主要是读取动作,但经常创建,很多对象 1000+ 并且它们将被定期过滤
示例:

两者中哪一个具有最好的资源管理(内存和 CPU)和最好的 CRUD 操作在 API 末端下游的可编码性?不问主观问题。

为了澄清,我想知道哪种对象设计#1 或#2 最适合每种情况 1 和 2。