Module 如何划分和遵循应用程序中的模块?

Module 如何划分和遵循应用程序中的模块?,module,Module,我想知道为什么很少有关于如何编程到模块的示例和阅读材料 几乎每一个大型项目都会在这么多代码中间丢失,即使它在一个单独的文件夹中。(嗯,我知道) 我想了解并可能看到一个面向模块的设计的快速示例或链接 模块,它是系统的独立部分。您可以始终将更多模块连接到主模块 fooApp Core.jar(.dll) fooApp BI fooApp报告 Core将具有基本的域模型,以及所需的库、ui、控件和视图 但Core如何知道BI是否可用?他们会打必要的电话吗 我说清楚了吗 如果可以的话,请给我举个例子。区

我想知道为什么很少有关于如何编程到模块的示例和阅读材料

几乎每一个大型项目都会在这么多代码中间丢失,即使它在一个单独的文件夹中。(嗯,我知道)

我想了解并可能看到一个面向模块的设计的快速示例或链接

模块,它是系统的独立部分。您可以始终将更多模块连接到主模块

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等。我知道很多东西都使用模块,但这是如何工作的?我怎么能在我自己的应用程序中复制这样的内容呢?我想你没有区分几个不同的概念。下面的代码都是关于动态地适应“定位器”的存在或不存在。这并不限于整个应用程序在一个或多个模块中的结构。请试着多解释一点你特别想要实现的目标。将应用程序划分为模块是一回事,动态地适应功能的存在与否是另一回事。您试图解决哪一个问题?动态地适应功能的存在或缺失。我会找像这样的东西。好的。因此,我的答案是指国际奥委会框架,这是您需要考虑的一个方向。我将把我的答案扩大一点。这可以工作,但不是很灵活。一个问题是视图和受控对象都需要针对存在的每个不同“模块”的特定代码,如果创建了新的模块,则必须更改这两个代码。而且,这实际上与模块无关。如果所有类都在同一个模块中,则此代码可以在完全相同的情况下工作。