我有这个Web应用程序已经发展到一个难以管理的混乱.
我想将它拆分为一个通用的"框架"部分(仍包括网页内容,如页面和图像)和几个增加额外功能和屏幕的模块.我希望这种重构也可用作第三方扩展的插件系统.
所有模块都需要是独立的部署单元,理想情况下是war或jar文件.
我试图制作几个常规战争文件,但是Tomcat保持(根据servlet规范)这些war文件完全彼此分开,因此他们不能共享他们的类,例如.
我需要插件才能看到"主"类路径.
我需要主应用程序来控制插件,例如能够列出它们,并设置它们的配置.
我想保持插件本身之间的完全分离(除非它们指定依赖项)和可能在同一个Tomcat上运行的任何其他不相关的Web应用程序.
我希望它们根植于"主"应用程序URL前缀,但这不是必需的.
我想使用Tomcat(大型架构更改需要与太多人协调),还要听到EJB或OSGi世界中的干净解决方案(如果有).
这个问题也发布在Prism的Codeplex网站上.
我在按需加载模块时有点迷失,我希望你们能够启发我.我正在使用v2#7.
1)我有2个区域 - 一个用于实例化模块的按钮(MenuRegion),另一个用于显示模块(MainRegion).在MenuRegion中一次只能看到一个模块.
2)模块可以在目录中找到
3)MenuModule模块与MenuRegion相关联,用于创建显示模块名称的按钮.单击其中一个按钮时,将加载相应的模块并显示在MainRegion中.
4)行为:
a)单击ModuleA按钮并显示ModuleA.用户在ModuleA中输入数据,数据保持未保存状态.
b)单击ModuleB按钮并显示ModuleB.用户在ModuleB中输入数据,数据保持未保存状态.
c)单击ModuleA按钮,显示ModuleA,其中包含先前输入的信息.
1)MainRegion应该是ContentControl,因此一次只能看到一个模块.
2)我想我需要枚举我的目录的"GrouplessModules"来获取目录中可用模块的ModuleInfo
3)加载模块我认为我需要调用myModuleManager.LoadModule(moduleName)
1)我应该在我的MenuModuleView的构造函数中将moduleManager作为参数吗?
2)如何从MenuModuleView内部访问目录,以便枚举可用的模块?
3)从MenuModuleView,我通过模块枚举,我创建按钮,将ModuleInfo分配给按钮的Tag属性.这样,我只有一个点击事件来加载模块.它是否正确?它闻起来有点像我的工作...
非常感谢你的帮助!!!
我的Android主应用程序将包含一个主程序,其中包含一些预安装的模块.
然后我想稍后提供不同的模块,最好是作为单独的文件.模块如:位置,天气,议程.
你会怎么做到这一点?
我想在数据库中保留已安装/存在的模块.因此,我有时必须将模块放入数据库,可能是通过检测启动时是否存在.主应用程序将基于这些模块工作.
如何将这些模块构建为单独的文件?它们不会成为我申请中的切入点.因此它们不能是导航菜单中的应用程序.
这可能吗?
我如何使用Eclipse创建它?
我将以什么格式提供模块?
用户如何添加/删除模块?
这是一个很大的问题.
我有一个结构良好但单片的代码库,它具有原始的模块化架构(所有模块实现接口但共享相同的类路径).我意识到这种方法的愚蠢以及当我在可能具有不同冲突版本的库的应用程序服务器上进行部署时它所代表的问题.
我现在依赖于大约30个罐子而且在中途将它们收起来.现在,我的一些模块很容易声明版本化的依赖关系,例如我的网络组件.它们静态引用JRE和其他BNDded库中的类,但我的JDBC相关组件通过Class.forName(...)实例化,并且可以使用任意数量的驱动程序之一.
我按服务区域将所有内容分解为OSGi包.
我希望我的代码能够在没有OSGi的情况下通过单个jar文件使用我的所有依赖项并且根本没有OSGi(通过JARJAR),也可以通过OSGi元数据和带有依赖性信息的粒度包进行模块化.
如何配置我的包和我的代码,以便它可以动态利用类路径和/或OSGi容器环境中的任何驱动程序(Felix/Equinox/etc.)?
是否有运行时方法来检测我是否在容器中兼容的OSGi容器中运行(Felix/Equinox/etc.)?
如果我在OSGi容器中,是否需要使用不同的类加载机制?
我是否需要将OSGi类导入到我的项目中,以便能够通过我的数据库模块加载at-bundle-time-unknown JDBC驱动程序?
我还有第二种获取驱动程序的方法(通过JNDI,它只在app服务器上运行时才真正适用),我是否需要更改支持OSGi的应用服务器的JNDI访问代码?
将代码分解为模块化/解耦的函数和类是很好的,但如果你做得太多,你会得到非常碎片的代码,这也是不好的.
何时将代码拆分为函数的黄金法则是什么?
我正在Haskell写一个蛇游戏.这些是我的一些东西:
Coord数据类型Line数据类型Rect数据类型Polygon类型类,它允许我获得Rect一系列的行([Line]).Impassable类型类,它允许我获得Line一系列Coords([Coord]),以便我可以检测其他Impassables 之间的冲突.Draw我要绘制到屏幕的任何内容的类型类(HSCurses).Arbitrary为很多这些东西声明实例.目前我有很多这些在单独的模块中,所以我有很多小模块.我注意到我必须互相导入很多这样的东西,所以我有点想知道重点是什么.
我对Arbitrary实例感到特别困惑.在使用-Wall时,当我将这些实例放在一个测试文件中时,我得到关于孤立实例的警告,我的理解是我可以通过将这些实例放在与定义数据类型的模块相同的模块中来避免该警告但是我需要import Test.QuickCheck对于所有那些看似愚蠢的模块,因为只有在构建测试可执行文件时才需要QuickCheck.
有关QuickCheck特定问题的任何建议都将受到赞赏,因为有关如何/何地将程序划分为模块的更一般问题的指导.
我是骨干新手,我在这里请求一些帮助,了解我将如何构建我当前的webapp项目.我正在为服务器开发模块化管理面板.面板的每个"页面"都应该是一个打包的"模块",包括控制器,模型和视图.
该面板将包含最初加载的主布局视图,以及基本导航.当用户单击导航上的链接时,页面将通过AJAX加载到布局中.(如果这听起来很愚蠢/有理由不这样做请告诉我:))
由于其他人也会开发这些页面,并且因为它们是模块化的,所以我不知道我将通过AJAX加载的页面中将显示哪些模型,视图和控制器.
我怎样才能最好地与骨干一起做这件事?
我特别想知道如何动态扩展Backbone模型等,以及如何管理(例如)用户离开页面和/或稍后重新访问它.
Backbone是否提供了我可以使用的东西,我是否需要将自己的东西放在一起,是否有更好的方法来做我错过的事情?
所以这是着名的JavaScript模块模式的一个例子:
var Person = (function() {
var _name; // so called 'private variable'
function Person(name) {
_name = name;
}
Person.prototype.kill = function() {
console.log(_name + ' has been shot');
};
return Person;
})();
var paul = new Person('Paul');
paul.kill();
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好吧?这会记录'Paul has been shot'到控制台,这是我们想要的.
但.
是_name一个真正的私有变量?我将私有变量定义为属于对象实例的变量,外部世界无法访问该变量.最后一部分工作,我无法_name从封闭外部访问.
但如果我这样做:
var paul = new Person('Paul');
var bran = new Person('Bran');
paul.kill();
bran.kill();
Run Code Online (Sandbox Code Playgroud)
然后这将记录'Bran has been shot'两次.那里没有保罗.所以,_name实际上是与所有实例共享我的Person对象的.这就是我将其定义为"静态变量",尽管它也无法从外部访问.
那么有没有办法用模块模式创建一个真正的私有成员变量?一个不是静止的.
同样发生的事情是this._name …
假设我正在使用Gradle进行模块化库开发.在我的根项目我有子项目geometry,algorithms,visualizer,我想每发布一个罐子神器.
至于我的根目录,build.gradle我有以下部分:
apply plugin: 'maven-publish'
publishing {
publications {
publishDemos(MavenPublication) {
groupId 'ru.ifmo.ctddev.igushkin.cg'
artifactId 'geometry'
version globalVersion
artifact project(':geometry').tasks.getByName('jar')
}
publishAlgorithms(MavenPublication) {
groupId 'ru.ifmo.ctddev.igushkin.cg'
artifactId 'algorithms'
version globalVersion
artifact project(':algorithms').tasks.getByName('jar')
}
publishVisualizer(MavenPublication) {
groupId 'ru.ifmo.ctddev.igushkin.cg'
artifactId 'visualizer'
version globalVersion
artifact project(':visualizer').tasks.getByName('jar')
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是:是否有更短的描述出版物的方式?例如,我想声明,对于每个子项目,我需要一个带有artifactId名称集合的出版物.
接下来,我的子项目互相依赖,两者algorithms并visualizer依靠来自班geometry,但在这一点上的罐子不包含依赖关系,并且,例如,用户将不得不依赖同时添加到geometry和algorithms,如果他们想使用algorithms.
那么,有没有办法提供某种自动依赖,所以添加algorithms也会添加geometry?如果是,我该怎么办?如果不是,提供模块化库的惯用方法是什么?我应该组装具有依赖性的罐子吗?
UPD:我是对的,而不是artifact ...我应该使用from project(':...').components.java,因为它会拾取工件和依赖项?如果我使用,如何单独选择依赖项 …
在使用MinGW,C++ 11,Qt 5和qmake的Windows下我有以下项目结构:
/my-project
my-project.pro
/my-app
my-app.pro
main.cpp
/module-a
module-a.pro
modulea.h
modulea.cpp
/module-b
module-b.pro
moduleb.h
moduleb.cpp
Run Code Online (Sandbox Code Playgroud)
模块之间的依赖关系应如下所示:
my-app ==> module-a ==> module-b
Run Code Online (Sandbox Code Playgroud)
我想要实现的是my-app使用module-a,module-a使用module-b而my-app对module-b一无所知.模块-a仅通过其实现引用模块-b(#includefor module-b位于module-a的.cpp中).
我试图通过在qmake中将module-a和module-b配置为静态库来实现这一点.不幸的是,在编译时我收到链接器错误,说"对ModuleB :: doSmthB()的未定义引用"
我理解这个链接问题的原因,我的问题是,是否有可能实现类似于提议的分层结构的东西?
资料来源:
my-project.pro:
TEMPLATE = subdirs
SUBDIRS += module-b
SUBDIRS += module-a
SUBDIRS += my-app
my-app.depends = module-a
module-a.depends = module-b
Run Code Online (Sandbox Code Playgroud)
my-app.pro:
QT += widgets
TARGET = my-app
TEMPLATE = app
CONFIG += c++11
SOURCES += *.cpp
win32 {
INCLUDEPATH += $$clean_path($$PWD/../module-a)
DEPENDPATH += $$clean_path($$PWD/../module-a)
LIBS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a)
PRE_TARGETDEPS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a) …Run Code Online (Sandbox Code Playgroud) modularity ×10
java ×3
android ×1
architecture ×1
backbone.js ×1
c++ ×1
decoupling ×1
dependencies ×1
eclipse ×1
function ×1
gradle ×1
haskell ×1
javascript ×1
jdbc ×1
module ×1
osgi ×1
prism ×1
publishing ×1
qmake ×1
qt ×1
servlets ×1
tomcat ×1
wpf ×1