C# 如何在框架中更好地组织类/包,以便我的应用程序的客户端可以轻松地扩展它们?
让我们假设我负责开发一款拼字游戏,因为客户的主要要求之一是能够稍后尝试不同的游戏方式和模式。我已经做了一个足够灵活的设计来支持这些变化。剩下的唯一问题是向客户机公开什么(对象的访问修饰符),以及如何组织它(如何在名称空间/包中公开我的对象) 我应该如何定义一些东西,使客户既可以轻松地使用我的标准实现(一个标准的拼字游戏),又能够进行他想要的所有修改?我想我需要的是一种框架,他可以在这个框架上工作 我在一个非严格的分层系统中组织了我的类/接口: 数据类型 包含可能在整个系统中使用的基本数据类型。系统中的任何人都可以访问此包及其成员。其所有成员都是公共的 领域 包含我定义的所有接口,这些接口可能有助于实现客户端的新Scrabble。还包含游戏中使用的值类型,如Piece。其所有成员都是公共的 启动位置 包含在Implementations.StandardScrabble包中实现我的标准拼字游戏所需的所有类/代码。例如,如果客户端决定实现游戏的其他变体,他可以在implements.XYZ中创建它们。 这些类都是受包保护的,包外唯一可用的是游戏外观。使用域和数据类型包 用户界面 包含我实现的UI类,以便客户端和程序用户都可以运行游戏(我的实现)。可以访问所有其他层C# 如何在框架中更好地组织类/包,以便我的应用程序的客户端可以轻松地扩展它们?,c#,java,oop,frameworks,uml,C#,Java,Oop,Frameworks,Uml,让我们假设我负责开发一款拼字游戏,因为客户的主要要求之一是能够稍后尝试不同的游戏方式和模式。我已经做了一个足够灵活的设计来支持这些变化。剩下的唯一问题是向客户机公开什么(对象的访问修饰符),以及如何组织它(如何在名称空间/包中公开我的对象) 我应该如何定义一些东西,使客户既可以轻松地使用我的标准实现(一个标准的拼字游戏),又能够进行他想要的所有修改?我想我需要的是一种框架,他可以在这个框架上工作 我在一个非严格的分层系统中组织了我的类/接口: 数据类型 包含可能在整个系统中使用的基本数据类型。系
我组织事情的方式有几个缺点,最明显的是,如果客户想要创建自己的游戏版本,他基本上必须自己实现几乎所有的东西(我在域中共享接口,但他几乎什么也做不了).我觉得我应该把所有实现的类都传递给域,然后在实现名称空间中只有一个构建我的标准拼字的外观 你会如何处理这个问题?有没有关于如何构建这种程序(基本上是框架)的推荐读物 谢谢MVC/计算机模式 您可以发布包的早期版本。 以后,您可以根据用户需求进行升级
如果您明智地使用MVC或其他复合模式,我相信您也可以轻松地升级包。对于算法和策略,我将定义接口和默认实现,并提供由您自己的实现扩展的抽象超类,以便所有样板代码都在抽象超类中。此外,我还允许客户端对impl进行子类化。只需创建多个impl,您就可以看到将什么放置在何处
但最重要的是:给你的客户代码。如果他需要知道代码放在哪里,他也应该能够看到你的代码。不需要隐藏任何东西。我认为你试图给客户太多的自由。这一定会让你很难处理事情。根据你所描述的,这似乎是错误的客户端将能够修改游戏模型、逻辑、用户界面的几乎所有部分…我认为最好限制应用程序中可修改的区域,但通过通用
插件界面集公开一些区域。这也会让用户更容易-他只需要了解插件如何工作,而不是整个应用程序的功能逻辑。如果你愿意,为你的插件定义区域——UI插件、游戏模式插件等等。许多生产应用程序和游戏都是这样工作的(回想一下暗黑破坏神II和它拥有的各种各样的插件吧!).无论您提出什么设计,我都会在尽可能多地隐藏实现方面犯错误。一旦您公开了一个实现,您就无法收回它(除非您准备与您的客户群展开激烈的战争)。您可以随时在以后提供您认为合适的默认实现
通常,我会从只提供瘦接口开始。然后,在提供抽象类之前,我可能会提供实用类(例如,工厂
,构建器
,等等)
我建议阅读Josh Bloch的著作,了解设计面向对象代码时有用的一般实践。顺便说一句,请阅读Krzysztof Cwalina和Brad Abrams的《框架设计指南:可重用.NET库的约定、习惯用法和模式》一书,该书由Addison Wesley于2005年出版。值得一读。