如何使Java桌面应用程序模块化?如何对模块进行分类?
我正在SQL Server 2008中为一些报告构建一个新数据库,并且有许多与此数据相关的常见业务规则可用于不同类型的报告.目前,这些规则大多数都是在较大的程序程序中使用遗留语言进行组合,我正试图将其转移到SQL.我正在努力从这些数据中实现报告的灵活性,例如SAS中的一些报告,C#中的一些报告等.
我目前的方法是打破这些通用规则(通常是非常简单的逻辑)并将它们封装在单独的SQL UDF中.性能不是问题,我只想使用这些规则在一种报告"快照"中填充静态字段,然后可以用它来以任何方式报告.
我喜欢这种模块化的方法,只要了解每条规则正在做什么(以及维护规则本身),但我也开始有点害怕维护也可能成为一场噩梦.有些规则依赖于其他规则,但我无法真正摆脱这些 - 这些东西相互叠加......这就是我想要的......我想?;)
这种模块化方法在数据库中是否有更好的方法?我是在正确的轨道上,还是我在太多的应用程序开发思维中考虑这个问题?
我正在考虑为我们的产品开发考虑一个Web应用程序开发框架.我想构建一个ASP.NET应用程序,其中包含许多子模块.我的要求是:
该应用程序将是一套不同的模块,如CRM,Bugtracker,库存管理,财务管理等.
每个模块都应该有自己的DLL.
一个项目应该是应用程序的外部容器(如框架),并且该项目应该将解决方案中的所有其他模块(类型为Web应用程序)引入外部容器.(有些事我们在HTML中有框架).因此,我们将仅在一天结束时发布外部容器Web应用程序,并通过该方式访问所有其他Web应用程序项目.
我想为每个模块都有单独的DLL,所以当我部署控制整个套件的单个DLL时,我不必担心应用程序崩溃.
我不确定我的想法是否正确.我正在寻找的最终结果是一个维护良好,有组织和模块化的Web应用程序套件.
它是ASP.NET Web表单,而不是MVC.我将使用VS2010进行开发.
这样做的最佳方法是什么?
编辑:
术语外部容器意味着它就像一个母版页,它有各种模块的链接,各种模块并不总是在同一个项目中.它们可以是同一解决方案下的独立项目.而且我的印象是,到一天结束时,我将只发布该项目,它将带来各种模块.
模块化应用程序是指可以在不修改核心应用程序代码的情况下扩展基本功能和数据模型的应用程序.
这是一种流行的方法,例如.像SugarCRM或VTiger这样的开源CRM.
在asp.net mvc应用程序中可以使用区域或(来自MVC contrib的可移植区域)遵循这种方法,这允许在单独的程序集中添加新的控制器和视图,而不会影响核心dll.
当想要扩展基础应用程序的数据模型时出现问题.在实际框架中,模型定义集中在Edmx文件中是不可能的.此方法不允许添加将在新程序集中引用某个基本模块表的新表.
我注意到,Orchard CMS通过使用nHibernate实现了完全的模块化(这是有说服力的,因为他们有微软的支持并且该项目被视为技术展示).由于POCO方法,Nhibernate允许这种模块化.每个实体/表都在一个单独的文件中定义,这显然是模块化应用程序的方式.
然而,对于Entity Framework Code Only方法存在希望,该方法使用POCO定义在运行时生成Edmx模型.有没有人尝试过这种方法在单独的可插拔项目中分发数据模型的定义?
伙计们!
我是一名具有Java背景的软件开发人员,我正在使用Ruby Web框架(Padrino/Sinatra)开始一些项目.
在我的java项目中,我通常有一些"常见"项目,其中的类在几个项目中使用.例如,我有一个中央身份验证服务,以及一个存储用户配置文件的共享数据库.我使用此服务的所有项目共享一些映射到用户配置文件数据库的模型.
所以,尽管有框架,orm lib等,在多个Ruby项目中共享代码的最佳方式是什么?
我正在尝试用Java实现上面的社区检测算法,虽然我可以访问C++代码和原始论文 - 但我根本无法使用它.我的主要问题是我不理解代码的目的 - 即算法如何工作.实际上,我的代码卡在似乎是无限循环的位置mergeBestQ,列表heap似乎在每次迭代时变得越来越大(正如我所期望的那样),但值topQ总是返回相同的值.
我正在测试它的图表相当大(300,000个节点,650,000个边缘).我用于实现的原始代码来自SNAP库(https://github.com/snap-stanford/snap/blob/master/snap-core/cmty.cpp).如果有人能够向我解释算法的直觉,那么最好将每个节点设置在自己的社区中,然后记录每对节点的模块性值(无论是什么).图,然后找到具有最高模块性的节点对并将它们移动到同一社区.另外,如果有人可以提供一些中级伪代码,那就太好了.这是我到目前为止的实现,为了简洁起见,我试图将它保存在一个文件中,但是CommunityGraph和CommunityNode在其他地方(不应该是必需的).图表维护所有节点的列表,每个节点维护其与其他节点的连接列表.在运行时它永远不会越过线while(this.mergeBestQ()){}
更新 - 在彻底审查后,在我的代码中发现了几个错误.代码现在很快完成,但没有完全实现该算法,例如图中的300,000个节点,它表示大约有299,000个社区(即每个社区大约有1个节点).我在下面列出了更新的代码./// Clauset-Newman-Moore社区检测方法.///每一步都会合并两个对全球模块化贡献最大正值的社区.///参见:在非常大的网络中查找社区结构,A. Clauset,MEJ Newman,C.Moore,2004公共类CNMMCommunityMetric实现CommunityMetric {私有静态类DoubleIntInt实现Comparable {public double val1; public int val2; public int val3; DoubleIntInt(double val1,int val2,int val3){this.val1 = val1; this.val2 = val2; this.val3 = val3; }
@Override
public int compareTo(DoubleIntInt o) {
//int this_sum = this.val2 + this.val3;
//int oth_sum = o.val2 + o.val3;
if(this.equals(o)){
return 0;
}
else if(val1 < o.val1 || (val1 == o.val1 && val2 < o.val2) || (val1 …Run Code Online (Sandbox Code Playgroud) 我真正的问题是:是否可以使用sequelize将模型放在单独的文件夹中?
我问这个是因为我试图在我的应用程序中使用模块化结构,为了实现我需要将模型,控制器和路由放在同一个文件夹中,这就是我的意思:
??? node_modules
??? src
? ??? client
? ? ??? ... //Frontend things managed by angular (like views, etc...)
? ??? server
| ??? components
| | ??? db
| | | ??? migrations
| | | | ??? users.js
| | | | ??? ...
| | | ??? seeders
| | | ??? config.json
| | | ??? options.json
| | | ??? index.js
| | ??? env
| | ??? ...
? ??? modules //By …Run Code Online (Sandbox Code Playgroud) 我正在努力深入理解ML风格的模块:我认为这个概念很重要,我喜欢他们鼓励的那种思维方式.我刚刚发现参数类型和参数模块之间可能出现的张力.我正在寻找工具来思考这个问题,这将有助于我在构建程序时做出明智的设计决策.
拳头我将试着总体上描述我的问题.然后我将从我正在研究的学习项目中提供一个具体的例子.最后,我将重新审视一般性问题,以便将其引入一定程度.
(对不起,我还不太了解这个问题更简洁.)
总的来说,我发现的紧张是:当我们为它们提供参数类型签名(适当时)时,函数是最灵活的,并且对最广泛的重用开放.但是,当我们在模块内部封闭函数的参数化时,模块是最灵活的,并且对最广泛的重用是开放的,而是在给定类型上参数化整个模块.
在将实现LIST签名的模块与实现签名的
模块进行比较时,可以找到这种差异的现成示例ORD_SET.模块List:LIST提供了许多有用的函数,可以在任何类型上进行参数化.一旦我们定义或加载了一个List模块,我们就可以轻松地应用它提供的任何功能来构造,操作或检查任何类型的列表.例如,如果我们使用字符串和整数,我们可以使用同一个模块来构造和操作两种类型的值:
val strList = List.@ (["a","b"], ["c","d"])
val intList = List.@ ([1,2,3,4], [5,6,7,8])
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我们想要处理有序集合,那么事情是不同的:有序集合要求有序关系保持其所有元素,并且没有单个具体函数compare : 'a * 'a -> order
为每种类型产生该关系.因此,我们需要一个不同的模块来满足ORD_SET我们希望放入有序集合的每种类型的签名.因此,为了构造或操纵有序的字符串和整数集,我们必须为每种类型实现不同的模块[1]:
structure IntOrdSet = BinarySetFn ( type ord_key = int
val compare = Int.compare )
structure StrOrdSet = BinarySetFn ( type ord_key = string
val compare = String.compare )
Run Code Online (Sandbox Code Playgroud)
然后,当我们希望对给定类型进行操作时,我们必须使用适当模块中的拟合函数:
val strSet = StrOrdSet.fromList ["a","b","c"]
val intSet = IntOrdSet.fromList [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
这里有一个非常直接的权衡:LIST模块提供的范围超出你喜欢的任何类型的函数,但它们不能利用任何特定类型的值之间的任何关系; ORD_SET …
我在嵌入式目标中编写C语言.由于日益复杂和可测试性问题,模块化是必须的.
一目了然,该程序是一个控制循环.使用内部硬件读取物理输入,应用一些计算并应用计算输出.但是,控件非常复杂,并且具有许多内部状态和变化的变量.
该控件分为不同的模块,捆绑不同状态的功能.常见的任务/计算在不同的模块中提供,并在不同的模块中调用,以保持自己的干燥.对于整个项目中的枚举和类型一致性,使用了一个顶级的.H文件(就我而言,在我的框架中,诸如继承之类的OO策略不是一个选项).
在决定如何将变量传递给模块和从模块传递变量时,我的问题出现了.
我最初的做法是:
mymodule.H:
struct Inputs{
int input1;
...
int inputN;
}
struct Outputs{
int output1;
...
int outputN;
}
void mymodule(Inputs in,Outputs* out);
Run Code Online (Sandbox Code Playgroud)
并且在main函数(或调用此模块的模块)中创建了"Inputs"和"Outputs"类型的结构.
然后,将变量复制到Inputs结构中,调用该函数(引用Outputs结构),一旦完成,该结构的内容将用于进一步的计算.
但是,这会导致大量内存占用,因为每个模块都需要在调用模块中创建InputType和OutputType实例.在我看来,这不是一个优雅的解决方案.顺便说一下,我的项目中不允许动态分配.
您能否提供一些指导和/或替代想法以获得良好的解决方案?
谢谢.
添加
其中一个解决方案可能是将InputStruct也作为指针传递,但由于它们是模块的有效输入,我怎么能保证它们不会沿着代码修改?
添加
顺便说一句,出现的另一个问题是,并非所有模块都接收相同的变量,并且没有可用的继承机制(因为这是C),每个模块的结构都必须加载适当的值.我很混淆......
modularity ×10
java ×2
.net ×1
algorithm ×1
asp.net ×1
asp.net-mvc ×1
c ×1
c++ ×1
code-reuse ×1
desktop ×1
dry ×1
embedded ×1
graph-theory ×1
igraph ×1
model ×1
node.js ×1
ocaml ×1
orm ×1
paradigms ×1
parameters ×1
performance ×1
r ×1
ruby ×1
sequelize.js ×1
sml ×1
sql ×1
sql-server ×1
types ×1