问题标签 [software-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 投票
5 回答
228 浏览

python - 应该在类层次结构中的哪个位置编写实例方法?

这是我用于模拟模型的类“层次结构”的一部分(我的代码在 Python 中,但我认为我的问题与语言无关):

问题:我应该把move实例方法放在哪里?

我认为我应该将依赖限制class Agent在层次结构中低于自身的类(即,其实例包含在Agent实例中的类)。但这意味着move方法不能存在,class Agent因为它创建了对描述地形等的类(至少是接口)的依赖 - 所以我不妨添加对Agent(因此依赖于)的引用World。从软件设计的角度来看,这可以吗?

另一种方法是将方法move放入class World,它不会导致任何额外的依赖关系。但是,class World然后将完成几乎所有的工作,在我看来,这将违背 OOP 的主要思想(我的理解是不要将所有功能集中到一个地方,而是将其包含在相关类中) .

性能方面的考虑只是次要问题(而且我认为这两种方法之间的性能不会有所不同)。

编辑:我误用了上面的“类层次结构”一词。我指的不是继承层次结构,而是一堆实例相互包含的类。

0 投票
1 回答
143 浏览

architecture - 链接设置器:有缺点吗?

我已经开始使用一种从 jQuery 中采用的技术,在我的设置器中称为链接。例子:

我更喜欢这种方式,因为它可以很容易地设置多个属性。

有缺点吗?我已经问过几个 Java 程序员,但他们只能说它“不好”,但他们无法给我一个正确的解释为什么。

0 投票
5 回答
6656 浏览

php - 为什么在 php 中使用类?

我想知道为什么我们在 php 中使用类。我在所有开源代码中都看到他们使用类来执行查询。这意味着他们使用类来获取结果、插入查询等。我认为这用于一致性和加速,但据我所知,如果我们使用 执行查询mysql_query(),而不是创建对象链接$db->query将比第二个链接执行得更快,因为在对象中它将转到该函数,然后在那里执行它,然后返回结果,但如果mysql_query()它会在同一个地方执行查询。所以我认为mysql_query()会执行得很快。那么为什么我们使用类和对象来执行查询,使用类有什么好处呢?

0 投票
4 回答
275 浏览

c++ - 这是一个合格的软件设计吗?

我目前正在使用 C++ 开发游戏。由于没有垃圾收集器,因此必须始终小心地删除对象,并确保这些对象一旦被删除就不再被访问。
现在随着项目的发展,一些对象可能会被越来越多的地方引用。例如,我在游戏中的单位可能会从渲染器、场景层次结构、选择机制、HUD 等中引用。现在 - 如果一个对象被删除,必须确保所有其他引用该对象的类都将收到通知。
或者让我们反过来说 - 如果我创建一个可能引用我的一个单元的新类,我还必须更改单元的代码(或单元管理器的代码或任何模块删除单元,如果它得到销毁)以确保这个新模块知道它当前引用的特定单元何时被删除。

现在我认为可以有一种简单的事件驱动的通用方法来解决这个问题,方法是创建一个基类,另一个对象可以订阅该基类。像这样的东西:

有了这个 - 如果我从一个新类引用从这个类继承的任何对象,我可以简单地将自己添加为订阅者,如果该对象将从任何其他地方删除,我将收到有关它的通知。

这是一种“干净”的编码方式吗?

0 投票
1 回答
150 浏览

zend-framework - 您将如何处理 Zend Framework 中的扩展/插件?

对于我的一个客户,我需要开发一个 CMS。例如,我需要具备以下功能:

  1. 可换肤(布局和扩展)
  2. 能够上传 zip 档案并处理它们(它们包含图片)
  3. 经典页面(文章 ala wordpress、joomla)
  4. 联系表
  5. 目录
  6. 一辆推车

我习惯了 Zend Framework,所以我想使用 Zf 来开发它。

我想要一个非常模块化的应用程序,我希望我在使用 Modx、Wordpress、Joomla、Magento 的经验能够帮助我避免糟糕的设计。

我想要一个简约的核心系统,我可以插入扩展/插件并能够使用定义的约定自定义它们。

例如,我希望即使我的“核心”功能之一也是这些扩展之一。

我的功能可能有:

  1. 一个管理界面
  2. 自定义/默认皮肤/主题
  3. 楷模
  4. 任何需要的固定装置
  5. 一个配置文件(xml/ini)
  6. 控制器
  7. 意见

所以我的问题是你会如何处理这样的设计?好吗?

我想知道如何为我的应用程序注册一个扩展,我将如何在我的布局、控制器中使用它。

好吧,我真的不知道如何开始,因为设计将定义我的应用程序的所有开发。

我已经决定使用 ZF 1.1/2、Doctrine 2、jQuery/Dojo(还不知道我真的不知道 Dojo)

0 投票
1 回答
2275 浏览

data-structures - 借书一种图书馆数据结构

首先,我想提一下这个问题是一个家庭作业问题。我一直在考虑实施很长时间。

我必须考虑并实现一个具有以下功能的库软件:

  1. 添加/删除新订阅者。
  2. 借/还书。
  3. 以下订阅者有什么书?
  4. 哪个订户持有以下书?
  5. 拥有最多书籍的订阅者列表。

我想过实现一个堆和2个红黑树,问题是空间复杂度很高。所以我想知道我是否遗漏了什么。

订户由 I.D 存储,书籍有代号。一棵红黑树是给订户的,另一棵是给借来的。堆是一个最大堆,以实现最后一个要求。

除了数据结构,我不能使用其他任何东西。

感谢您的任何见解和答案。

0 投票
1 回答
108 浏览

oop - 从两个角度对领域进行建模

我正在尝试对我的系统的域进行建模,但我遇到了问题并且可以提供一些帮助。

我的问题是观点之一。我正在建模一个系统,其中我有一个客户实体,该实体将有许多订单实体,并且系统将需要列出选定客户的所有订单(视角 1)。因此,我建模了一个包含 Orders 集合的 Customer 类......简单。但是我刚刚意识到,系统还需要列出所有订单以及客户的详细信息(观点 2),这意味着我从每个订单中都有一个客户参考。

问题是,从每个角度来看,我都会花时间创建我不感兴趣的对象。例如,当我将显示订单列表时,将为每个订单创建一个客户实例;反过来,Customer 实例将保存他们所做的订单的集合(从这个角度来看,我对此不感兴趣!!)。

有人可以提供建议吗?我以前遇到过这个问题,但我从来没有花时间设计一个合适的解决方案。

问候,

0 投票
3 回答
16745 浏览

python - python:抽象基类'__init__():初始化还是验证?

class ABC是一个“抽象基类”。class X是它的子类。

在 的任何子类中都需要完成一些工作ABC,这很容易忘记或做错。我想ABC.__init__()通过以下方式帮助捕捉此类错误:

(1) 开始这项工作,或 (2) 验证它

这会影响super().__init__()是在开始还是结束时调用X.__init__()

这是一个用于说明目的的简化示例:

假设每个子类都ABC必须有一个属性registry,并且它必须是一个列表。ABC.__init__()可以(1)初始化registry或(2)检查它是否被正确创建。以下是每种方法的示例代码。

方法一:在ABC中初始化

方法 2:在 ABC 中验证

哪个设计更好?

0 投票
4 回答
884 浏览

validation - 关于软件设计:我必须在哪里检查参数?

想象一下,我有一个应用程序向用户请求一个名称、一个类别列表。当用户单击保存按钮时,应用程序会将名称和类别保存到数据库中。

我有一个从 UI 获取名称和类别的图层。该层检查是否有名称(长度> 0的字符串)。如果这是正确的,它会将名称传递给另一个层。注意:类别是一个单选按钮列表,其中始终选择一项。

在第二层,应用程序将根据类别选择合适的类来保存名称。

在最后一层,一个类会将此名称保存在数据库中。在这堂课上,我将检查名称是否为空。

我的问题是:检查方法的输入参数的正确位置在哪里?在每一层?也许,我将在其他开发中使用这些层。

我的例子正确吗?也许,我可以在数据库层留下验证并在 UI 层引发异常。

0 投票
3 回答
903 浏览

com - com 中聚合、包含和委托的解释

你能解释一下聚合、遏制和授权之间的区别吗