Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在框架中更好地组织类/包,以便我的应用程序的客户端可以轻松地扩展它们?_C#_Java_Oop_Frameworks_Uml - Fatal编程技术网

C# 如何在框架中更好地组织类/包,以便我的应用程序的客户端可以轻松地扩展它们?

C# 如何在框架中更好地组织类/包,以便我的应用程序的客户端可以轻松地扩展它们?,c#,java,oop,frameworks,uml,C#,Java,Oop,Frameworks,Uml,让我们假设我负责开发一款拼字游戏,因为客户的主要要求之一是能够稍后尝试不同的游戏方式和模式。我已经做了一个足够灵活的设计来支持这些变化。剩下的唯一问题是向客户机公开什么(对象的访问修饰符),以及如何组织它(如何在名称空间/包中公开我的对象) 我应该如何定义一些东西,使客户既可以轻松地使用我的标准实现(一个标准的拼字游戏),又能够进行他想要的所有修改?我想我需要的是一种框架,他可以在这个框架上工作 我在一个非严格的分层系统中组织了我的类/接口: 数据类型 包含可能在整个系统中使用的基本数据类型。系

让我们假设我负责开发一款拼字游戏,因为客户的主要要求之一是能够稍后尝试不同的游戏方式和模式。我已经做了一个足够灵活的设计来支持这些变化。剩下的唯一问题是向客户机公开什么(对象的访问修饰符),以及如何组织它(如何在名称空间/包中公开我的对象)

我应该如何定义一些东西,使客户既可以轻松地使用我的标准实现(一个标准的拼字游戏),又能够进行他想要的所有修改?我想我需要的是一种框架,他可以在这个框架上工作

我在一个非严格的分层系统中组织了我的类/接口:

数据类型 包含可能在整个系统中使用的基本数据类型。系统中的任何人都可以访问此包及其成员。其所有成员都是公共的

领域 包含我定义的所有接口,这些接口可能有助于实现客户端的新Scrabble。还包含游戏中使用的值类型,如Piece。其所有成员都是公共的

启动位置 包含在Implementations.StandardScrabble包中实现我的标准拼字游戏所需的所有类/代码。例如,如果客户端决定实现游戏的其他变体,他可以在implements.XYZ中创建它们。 这些类都是受包保护的,包外唯一可用的是游戏外观。使用域和数据类型包

用户界面 包含我实现的UI类,以便客户端和程序用户都可以运行游戏(我的实现)。可以访问所有其他层


我组织事情的方式有几个缺点,最明显的是,如果客户想要创建自己的游戏版本,他基本上必须自己实现几乎所有的东西(我在域中共享接口,但他几乎什么也做不了).我觉得我应该把所有实现的类都传递给域,然后在实现名称空间中只有一个构建我的标准拼字的外观

你会如何处理这个问题?有没有关于如何构建这种程序(基本上是框架)的推荐读物

谢谢

MVC/计算机模式

您可以发布包的早期版本。 以后,您可以根据用户需求进行升级


如果您明智地使用MVC或其他复合模式,我相信您也可以轻松地升级包。

对于算法和策略,我将定义接口和默认实现,并提供由您自己的实现扩展的抽象超类,以便所有样板代码都在抽象超类中。此外,我还允许客户端对impl进行子类化。只需创建多个impl,您就可以看到将什么放置在何处


但最重要的是:给你的客户代码。如果他需要知道代码放在哪里,他也应该能够看到你的代码。不需要隐藏任何东西。

我认为你试图给客户太多的自由。这一定会让你很难处理事情。根据你所描述的,这似乎是错误的客户端将能够修改游戏模型、逻辑、用户界面的几乎所有部分…我认为最好限制应用程序中可修改的区域,但通过通用
插件
界面集公开一些区域。这也会让用户更容易-他只需要了解插件如何工作,而不是整个应用程序的功能逻辑。如果你愿意,为你的插件定义区域——UI插件、游戏模式插件等等。许多生产应用程序和游戏都是这样工作的(回想一下暗黑破坏神II和它拥有的各种各样的插件吧!).

无论您提出什么设计,我都会在尽可能多地隐藏实现方面犯错误。一旦您公开了一个实现,您就无法收回它(除非您准备与您的客户群展开激烈的战争)。您可以随时在以后提供您认为合适的默认实现

通常,我会从只提供瘦接口开始。然后,在提供抽象类之前,我可能会提供实用类(例如,
工厂
构建器
,等等)

我建议阅读Josh Bloch的著作,了解设计面向对象代码时有用的一般实践。

顺便说一句,请阅读Krzysztof Cwalina和Brad Abrams的《框架设计指南:可重用.NET库的约定、习惯用法和模式》一书,该书由Addison Wesley于2005年出版。值得一读。