处理对象并让它们互相交流的好方法是什么?
到目前为止,我所有的游戏爱好/学生都很小,所以这个问题通常以一种相当丑陋的方式解决,导致紧密集成和循环依赖.这对我正在做的项目规模来说很好.
然而,我的项目在规模和复杂性方面都变得越来越大,现在我想开始重新使用代码,让我的头脑更简单.
我遇到的主要问题通常是Player需要知道的问题Map,因此Enemy,这通常会导致设置大量指针并具有大量依赖关系,这很快变得混乱.
我按照消息风格系统的思路思考.但我真的不知道这是如何减少依赖性的,因为我仍然会在各处发送指针.
PS:我想这之前已经讨论过,但我不知道它的所谓只是我需要的东西.
c++ design-patterns circular-dependency tightly-coupled-code
想象一下,90%的工作仅仅是为了在一个非常庞大,非常破碎的网站上分类问题.想象一下,这个网站是用你所见过的最紧密耦合,最不具有凝聚力的PHP代码编写的,这种代码类型可以将原始开发人员添加到你的"一瞥"栏目中.想象一下,这个Web应用程序由4个非常不同的部分组成(1个商业,2个"重新定位",1个自定义)和一堆垃圾虚拟胶带和垫片.想象一下,它包含了一种编程实践,其中网站的主要组件实际上依赖于不正常工作的东西,修复这些破碎的东西通常会破坏其他东西.想象一下,你从太多糟糕的经历中知道改变一个看似无害的网站部分,比如拆分"名字" 字段分为两个单独的"第一"和"最后"字段,将使网站瘫痪,需要数小时的回滚,合并和补丁.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.
以下是您还应该想象的其他一些事情:
想象一下,甚至值得尝试达到中等水平的测试覆盖率?或者,在这个想象的情景中,你应该继续尽你最大的努力,你已经给予了什么,并希望,祈祷,甚至牺牲,客户将同意重写其中一天,然后你就可以开始写作了测试?
附录
因为你们中的许多人提出了这个问题:我已经接触过每次机会重新写作的可能性.与我合作的营销人员知道他们的代码是垃圾,他们知道这是他们最初使用的"最低出价"公司的错.作为承包商,我可能已经超越了我的界限,指出他们花了我一大笔钱给我这个网站提供临终关怀服务,而且从头开始重新开发他们会很快看到投资回报率.我还说我拒绝按原样重写网站,因为它实际上并没有按照他们的意愿去做.计划是重写它的BDD风格,但让所有关键球员都在一个地方很难,我仍然不确定他们知道他们需要什么.无论如何,我完全希望这是一个非常大的项目.
感谢到目前为止的所有反馈!
我正在为我正在开发的API创建一个错误管理器.这个想法是它提供了一个可以从API返回的错误代码存储,确保以相同的方式处理不同调用中的相同错误(例如,请求中缺少所需的值).
我最初的方法是:
$this->_errorManager->setError(ErrorCodes::REQUIRED_FIELD);
Run Code Online (Sandbox Code Playgroud)
但是,这会在我想要设置错误的任何地方创建对错误代码类的依赖.
替代方案是:
$this->_errorManager->setError(100);
Run Code Online (Sandbox Code Playgroud)
但是现在我的代码中间有一个数字,但没有任何意义.
虽然我可以想到这个特定问题的解决方案,但是在其他情况下我会想要使用"枚举"而我想不出一个没有紧密结合类的解决方案.
有没有更好的方法来做到这一点或采取不同的方法来消除魔数?或者是我必须接受并根据具体情况考虑的紧密耦合?
从我对 OO 设计/模式/原则的所有阅读和研究中,我发现普遍的共识是松耦合(和高内聚)几乎总是更好的设计。我完全同意从我过去的软件项目经验中发言。
但是,假设某个特定的软件公司(我不在其中工作)有一些设计有问题的大型软件,可以与某些硬件进行交互。这些模块(我从未研究过)是如此紧密耦合,并且函数调用可以深入 20 多个级别来管理状态。类边界从来没有明确定义,用例也没有考虑清楚。一个优秀的软件开发人员(不是我)会提出这些问题,但只会被更高级的开发人员拒绝,因为开发实践(如 SOLID 或 TDD)并不真正适用,因为该软件已经使用“传统”方法运行多年,再改变也晚了。客户(我不知道他们是谁)最大的抱怨是产品质量。
由于上述不切实际的场景(我从来没有分开过),我想过是否存在首选甚至需要紧耦合的情况?什么情况下开发人员需要跨越模块边界并共享状态并增加依赖性并降低可测试性?有哪些系统如此复杂以至于需要这样做?我自己想不出一个好的案例,所以我希望一些更有经验的工匠可以帮助我。
谢谢。再说一遍,我不知道这家公司。
紧耦合是指一组类高度依赖彼此的情况.
class C {
A a;
C(B b) {
a = b;
}
}
Interface A {
}
class B implements A {
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我通过类B的引用而不是父接口A接受类的对象.
我的代码松散或紧密耦合?
通过促进单一责任和关注点分离的设计实现松耦合.
使用父类或接口的引用使代码更灵活地采用任何子类的对象,但它如何促进单一责任.
松散耦合是否可以通过任何其他方式实现,而不是使用父类引用变量,在任何情况下都不是特定于我的代码?