Module 如何划分和遵循应用程序中的模块?
我想知道为什么很少有关于如何编程到模块的示例和阅读材料 几乎每一个大型项目都会在这么多代码中间丢失,即使它在一个单独的文件夹中。(嗯,我知道) 我想了解并可能看到一个面向模块的设计的快速示例或链接 模块,它是系统的独立部分。您可以始终将更多模块连接到主模块 fooApp Core.jar(.dll) fooApp BI fooApp报告 Core将具有基本的域模型,以及所需的库、ui、控件和视图 但Core如何知道BI是否可用?他们会打必要的电话吗 我说清楚了吗Module 如何划分和遵循应用程序中的模块?,module,Module,我想知道为什么很少有关于如何编程到模块的示例和阅读材料 几乎每一个大型项目都会在这么多代码中间丢失,即使它在一个单独的文件夹中。(嗯,我知道) 我想了解并可能看到一个面向模块的设计的快速示例或链接 模块,它是系统的独立部分。您可以始终将更多模块连接到主模块 fooApp Core.jar(.dll) fooApp BI fooApp报告 Core将具有基本的域模型,以及所需的库、ui、控件和视图 但Core如何知道BI是否可用?他们会打必要的电话吗 我说清楚了吗 如果可以的话,请给我举个例子。区
如果可以的话,请给我举个例子。区分实际的代码片段(类)和交付它们的模块。在一个简单的例子中,您启动一个应用程序,通常只说“您将在这些地方找到您需要的类”,这些地方是一个模块列表。我们使用路径(对于DLL)和/或类路径(对于Java类)。应用程序通常不需要知道类来自哪个DLL或JAR。[多个模块包含一个类的副本(可能有不同版本)的可能性如何?这时类加载变得非常有趣,但这完全是另一回事。] 那么,通用框架如何决定它需要哪些类呢?有很多可能的方法,但概念上是通过某种配置 看看控制反转和依赖注入的想法,也许可以开始 我将展示如何更改您的示例,使其符合您的要求。我不想在这里使用“模块”这个词,它有太多可能的含义。相反,我将使用“插件”-提供一段或多段代码,我们的视图希望使用提供的所有代码:
Controller {
// the list of what you have been calling modules
List<IPlugins> myPlugins;
initialise() {
// somehow we initialise that list of plugins
// imagine we read a config file, or some such
// If you read about Dependency Injection you'll see
// how we might do that
}
index(){
viewModel.setUser("John");
viewModel.setCategory("Programer");
showView(viewModel);
}
}
View {
showView(viewModel) {
System.out.println(viewModel.getUser().toString());
System.out.println(viewModel.getCategory().toString());
forEach( onePlugin : viewModel.getPlugins() ) {
System.out.println( onePlugin.getDisplayString() );
}
}
}
控制器{
//您一直在调用的模块的列表
列出我的插件;
初始化(){
//不知怎的,我们初始化了插件列表
//假设我们读取了一个配置文件,或者类似的文件
//如果您阅读了关于依赖注入的内容,您将看到
//我们该怎么做
}
索引(){
viewModel.setUser(“John”);
viewModel.setCategory(“编程器”);
showView(viewModel);
}
}
看法{
showView(视图模型){
System.out.println(viewModel.getUser().toString());
System.out.println(viewModel.getCategory().toString());
forEach(onePlugin:viewModel.getPlugins()){
System.out.println(onePlugin.getDisplayString());
}
}
}
如果我们可以假设所有插件都符合某个约定的接口,那么这是可行的,这里我们希望能够为每个插件调用getDisplayString()
通常,您所谈论的模块化类型取决于对插入框架的内容的某种程度的控制。它可以变得相当复杂。Java等语言允许您获取一个对象并“反射”以查找名称类似于“getXXXXX()”的所有方法。因此,视图可以被赋予任何旧对象,只需打印出(比如)getName()、getPhoneNumber()和getPostCode()的结果
这里的关键是,我们可以使用一些约定的模式来确定调用哪个methid。在这种情况下,视图可以非常灵活。让我们以此为例 fooApp-Core.jar
Controller {
index(){
viewModel.setUser("John");
viewModel.setCategory("Programer");
if(userLocatorModuleExists())
viewModel.setLocation(locatorModule.locate(viewModel.getUser()));
showView(viewModel);
}
}
View {
System.out.println(viewModel.getUser().toString());
System.out.println(viewModel.getCategory().toString());
if(userLocatorModuleExists())
System.out.println(viewModel.getLocation().toString());
}
是这样吗?恐怕我不明白你在问什么。。。如果您要求使用模块的代码,您一定不要看得太辛苦:示例包括Linux内核、ApacheWeb服务器、Perl、Pidgin等。我知道很多东西都使用模块,但这是如何工作的?我怎么能在我自己的应用程序中复制这样的内容呢?我想你没有区分几个不同的概念。下面的代码都是关于动态地适应“定位器”的存在或不存在。这并不限于整个应用程序在一个或多个模块中的结构。请试着多解释一点你特别想要实现的目标。将应用程序划分为模块是一回事,动态地适应功能的存在与否是另一回事。您试图解决哪一个问题?动态地适应功能的存在或缺失。我会找像这样的东西。好的。因此,我的答案是指国际奥委会框架,这是您需要考虑的一个方向。我将把我的答案扩大一点。这可以工作,但不是很灵活。一个问题是视图和受控对象都需要针对存在的每个不同“模块”的特定代码,如果创建了新的模块,则必须更改这两个代码。而且,这实际上与模块无关。如果所有类都在同一个模块中,则此代码可以在完全相同的情况下工作。