这是一个相当模糊的问题,但这是我在阅读有关适当设计的内容时从未感到满意的答案。
通常,在学习面向对象的编程,抽象,分解等方法时,设计的圣杯以及它们始终声称您使用的是开发技术的原因是,这将使您的程序“易于更改” ,“可维护的”,“灵活的”或用于表达这种有效果的概念的任何同义词。通过将ivars标记为私有,将代码拆分为许多小的自包含方法,使接口保持通用,可以使您完全轻松自如地修改程序。
对于较小的更改,这对我来说效果很好。改变类以提高性能所用的内部数据结构从来都不是主要困难,而且独立于API的用户界面端也没有改变,例如重新设计文本输入系统或检修游戏元素的图形。
所有这些更改似乎天生就是独立的。就所涉及的外部代码而言,它们均不涉及对要修改的程序组件的行为或设计进行任何更改。无论您是以程序编写还是以OO样式编写(具有大型功能还是小型功能),即使您只有中等程度的设计,也可以轻松进行这些更改。
但是,每当更改变得繁琐而繁琐时(即,对API进行更改),我的所有宝贵“模式”都无法挽救。巨大的变化仍然很大,受影响的代码仍然受到影响,并且大量的错误产生工作摆在我面前。
所以,我的问题是这个。适当的设计声称能够促进多大的变化?是否有一些其他的设计技术,或者对我来说是未知的,或者是我没有实现,确实确实使粘滞性修改变得简单,还是那个承诺(我听说过这么多不同的范例)仅仅是一个好主意,完全脱离了软件开发的一成不变的真理?我可以添加到工具栏中的“更改工具”吗?
具体来说,导致我进入论坛的问题是:我一直在努力实现一种解释性编程语言(在D中实现,但这无关紧要),并且我决定将闭包的参数设为基于关键字,而不是当前的位置。这就需要修改所有现有的调用匿名函数的代码,幸运的是,这很小,因为我很早就开发了我的语言(<2000行),但是如果我稍后再做出决定,那将是巨大的。在这种情况下,是否可以通过适当的预见性设计使修改变得更容易,或者确定(大多数)变化本质上影响深远?我很好奇这是否是我自己的设计技能的失败-如果是的话,我
明确地说,我绝不怀疑OOP或其他常用的模式。但是,对我而言,它们的优点在于代码库的原始编写而不是维护。继承使您可以很好地抽象出重复的模式,多态性使您可以通过人类理解的函数(哪个类)而不是由机器理解的效果(switch
语句的哪个分支)来分离代码,而小的独立函数可以让您以一种非常愉快的“自下而上”的风格写作。但是,我对他们的灵活性表示怀疑。
foo metarg1: bar metarg2: baz
as视为一个简单的问题foo.metarg1_metarg2_(bar, baz)
。但是,我的语言正在进行较大的更改,即将基于列表的参数更改为基于字典的参数,这实际上会影响运行时,但不会影响解析器,实际上,由于我的语言的特定属性,我现在不再讨论。由于在无序关键字和位置参数之间没有明确的映射,因此运行时是主要问题。