问题标签 [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.
python - 应该在类层次结构中的哪个位置编写实例方法?
这是我用于模拟模型的类“层次结构”的一部分(我的代码在 Python 中,但我认为我的问题与语言无关):
问题:我应该把move
实例方法放在哪里?
我认为我应该将依赖限制class Agent
在层次结构中低于自身的类(即,其实例包含在Agent
实例中的类)。但这意味着move
方法不能存在,class Agent
因为它创建了对描述地形等的类(至少是接口)的依赖 - 所以我不妨添加对Agent
(因此依赖于)的引用World
。从软件设计的角度来看,这可以吗?
另一种方法是将方法move
放入class World
,它不会导致任何额外的依赖关系。但是,class World
然后将完成几乎所有的工作,在我看来,这将违背 OOP 的主要思想(我的理解是不要将所有功能集中到一个地方,而是将其包含在相关类中) .
性能方面的考虑只是次要问题(而且我认为这两种方法之间的性能不会有所不同)。
编辑:我误用了上面的“类层次结构”一词。我指的不是继承层次结构,而是一堆实例相互包含的类。
architecture - 链接设置器:有缺点吗?
我已经开始使用一种从 jQuery 中采用的技术,在我的设置器中称为链接。例子:
我更喜欢这种方式,因为它可以很容易地设置多个属性。
有缺点吗?我已经问过几个 Java 程序员,但他们只能说它“不好”,但他们无法给我一个正确的解释为什么。
php - 为什么在 php 中使用类?
我想知道为什么我们在 php 中使用类。我在所有开源代码中都看到他们使用类来执行查询。这意味着他们使用类来获取结果、插入查询等。我认为这用于一致性和加速,但据我所知,如果我们使用 执行查询mysql_query()
,而不是创建对象链接$db->query
将比第二个链接执行得更快,因为在对象中它将转到该函数,然后在那里执行它,然后返回结果,但如果mysql_query()
它会在同一个地方执行查询。所以我认为mysql_query()
会执行得很快。那么为什么我们使用类和对象来执行查询,使用类有什么好处呢?
c++ - 这是一个合格的软件设计吗?
我目前正在使用 C++ 开发游戏。由于没有垃圾收集器,因此必须始终小心地删除对象,并确保这些对象一旦被删除就不再被访问。
现在随着项目的发展,一些对象可能会被越来越多的地方引用。例如,我在游戏中的单位可能会从渲染器、场景层次结构、选择机制、HUD 等中引用。现在 - 如果一个对象被删除,必须确保所有其他引用该对象的类都将收到通知。
或者让我们反过来说 - 如果我创建一个可能引用我的一个单元的新类,我还必须更改单元的代码(或单元管理器的代码或任何模块删除单元,如果它得到销毁)以确保这个新模块知道它当前引用的特定单元何时被删除。
现在我认为可以有一种简单的事件驱动的通用方法来解决这个问题,方法是创建一个基类,另一个对象可以订阅该基类。像这样的东西:
有了这个 - 如果我从一个新类引用从这个类继承的任何对象,我可以简单地将自己添加为订阅者,如果该对象将从任何其他地方删除,我将收到有关它的通知。
这是一种“干净”的编码方式吗?
zend-framework - 您将如何处理 Zend Framework 中的扩展/插件?
对于我的一个客户,我需要开发一个 CMS。例如,我需要具备以下功能:
- 可换肤(布局和扩展)
- 能够上传 zip 档案并处理它们(它们包含图片)
- 经典页面(文章 ala wordpress、joomla)
- 联系表
- 目录
- 一辆推车
我习惯了 Zend Framework,所以我想使用 Zf 来开发它。
我想要一个非常模块化的应用程序,我希望我在使用 Modx、Wordpress、Joomla、Magento 的经验能够帮助我避免糟糕的设计。
我想要一个简约的核心系统,我可以插入扩展/插件并能够使用定义的约定自定义它们。
例如,我希望即使我的“核心”功能之一也是这些扩展之一。
我的功能可能有:
- 一个管理界面
- 自定义/默认皮肤/主题
- 楷模
- 任何需要的固定装置
- 一个配置文件(xml/ini)
- 控制器
- 意见
所以我的问题是你会如何处理这样的设计?好吗?
我想知道如何为我的应用程序注册一个扩展,我将如何在我的布局、控制器中使用它。
好吧,我真的不知道如何开始,因为设计将定义我的应用程序的所有开发。
我已经决定使用 ZF 1.1/2、Doctrine 2、jQuery/Dojo(还不知道我真的不知道 Dojo)
data-structures - 借书一种图书馆数据结构
首先,我想提一下这个问题是一个家庭作业问题。我一直在考虑实施很长时间。
我必须考虑并实现一个具有以下功能的库软件:
- 添加/删除新订阅者。
- 借/还书。
- 以下订阅者有什么书?
- 哪个订户持有以下书?
- 拥有最多书籍的订阅者列表。
我想过实现一个堆和2个红黑树,问题是空间复杂度很高。所以我想知道我是否遗漏了什么。
订户由 I.D 存储,书籍有代号。一棵红黑树是给订户的,另一棵是给借来的。堆是一个最大堆,以实现最后一个要求。
除了数据结构,我不能使用其他任何东西。
感谢您的任何见解和答案。
oop - 从两个角度对领域进行建模
我正在尝试对我的系统的域进行建模,但我遇到了问题并且可以提供一些帮助。
我的问题是观点之一。我正在建模一个系统,其中我有一个客户实体,该实体将有许多订单实体,并且系统将需要列出选定客户的所有订单(视角 1)。因此,我建模了一个包含 Orders 集合的 Customer 类......简单。但是我刚刚意识到,系统还需要列出所有订单以及客户的详细信息(观点 2),这意味着我从每个订单中都有一个客户参考。
问题是,从每个角度来看,我都会花时间创建我不感兴趣的对象。例如,当我将显示订单列表时,将为每个订单创建一个客户实例;反过来,Customer 实例将保存他们所做的订单的集合(从这个角度来看,我对此不感兴趣!!)。
有人可以提供建议吗?我以前遇到过这个问题,但我从来没有花时间设计一个合适的解决方案。
问候,
爱
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 中验证
哪个设计更好?
validation - 关于软件设计:我必须在哪里检查参数?
想象一下,我有一个应用程序向用户请求一个名称、一个类别列表。当用户单击保存按钮时,应用程序会将名称和类别保存到数据库中。
我有一个从 UI 获取名称和类别的图层。该层检查是否有名称(长度> 0的字符串)。如果这是正确的,它会将名称传递给另一个层。注意:类别是一个单选按钮列表,其中始终选择一项。
在第二层,应用程序将根据类别选择合适的类来保存名称。
在最后一层,一个类会将此名称保存在数据库中。在这堂课上,我将检查名称是否为空。
我的问题是:检查方法的输入参数的正确位置在哪里?在每一层?也许,我将在其他开发中使用这些层。
我的例子正确吗?也许,我可以在数据库层留下验证并在 UI 层引发异常。
com - com 中聚合、包含和委托的解释
你能解释一下聚合、遏制和授权之间的区别吗