我使用的MVP模式来开发大规模应用。 虽然在发展工作,我想出了这个问题时是否应该使用成分或继承。 例如:让我们假设我有一个叫Foo的同域A和B的形式。 在本申请的另一部分我有具有相同的字段A和B,但附加字段℃的形式栏 。
目前,该代码被写入与在视图的形式从酒吧形式富继承继承方法。 主持人接着处理数据与模型稍有不同。 这工作了很简单,但我百思不得其解时是否遵循的经验法则“是”,因为即使形式是不同的,他们处理常见的输入(A和B)。
不过,在这里我一直在想“组成了继承”和的里氏替换原则 ,并会认为,我应该使用成分,而不是继承的。 然而,由于我使用的MVP它已经比较复杂,比预期的,因为我必须有形式与富域A和B演示然后酒吧与场下的主持人和foo的主持人,这样的引用它可以注入的字段A和B到它。
问题是,它已被证明是更多的代码,因为我将不得不添加某种getter和setter Foo中的主持人为它能够将数据传递到酒吧 。 这在某种程度上感觉就像如果我为了提供成分正在打破MVP。
所以我的问题是:
难道真的是我的情况下可用的组合物在继承好? 为什么?
使用是否构成“破发” MVP?
难道真的是我的情况下可用的组合物在继承好? 为什么?
是。 因为组合物是更可靠,更安全,更易于维护,更容易找到,更佐证的,并且在较大的应用更容易理解。 恕我直言。 :)
使用是否构成“破发” MVP?
是。 它打破那种你现在正在做简单的MVP。 组合可让您选择怎样的情侣你的代码,这是较大的应用程序非常好。 因为你要成为具体谈谈你是如何连接它并使用更多的代码。
一个简单的应用程序增长,并成为从简单的MVP继承到更复杂的组成的转变一个很好的候选人,是非常合理的。 这是一个去耦一步,使再挂钩的新途径。
这类似于许多简单的Web应用程序是如何转变成为正面/背面API驱动的应用程序。 这实质上是从后端存储模型的前端用户视图的去耦。
当形式是不同的,他们处理常见输入(A和B)。
这意味着富主持人是从酒吧主持人概念不同, 只是碰巧有一些共同的输入,因此他们不应该通过继承有关。 提取处理共同投入实用类代码,并重新使用,在这两种美孚主持人和酒吧主持人。
在富变化情况下的概念,也不会影响酒吧(和周围的其他方法:如果酒吧的概念,不能改变不改变富的概念也是如此, 则 “是一个”关系和继承可确实是用来)
有疑问时,总是喜欢组成
一个清洁组合物是将有类:
机型 :A,B,C,美孚,酒吧
浏览次数 :AView,BView,CView中,FooView,BarView
主持人们 :APresentor,BPresentor,CPresentor,FooPresentor,BarPresentor
凡FooView包含AView和BView,BarView包含AView,BView和CView的和有主持人们类似的成分。
该组合物使A,B和C(连同其观点和主持人们)模块化的,这样你可以混合和匹配,你喜欢和复合类(Foo和Bar)处理的集成。
这可能连同继承使用:如果酒吧是美孚的具体情况,则应该酒吧从福尔继承和BarPresentor可以从FooPresentor继承。 我会,不过,考虑的观点继承更每案时尚,作为意见会或有可能不适合继承,这取决于他们的行为。
当然,当富不延伸吧,你需要添加更多的代码,因为你有额外的getter和setter。 但是,非常大的好处是,富不依赖于酒吧了。 这看起来可能很轻微的好处,但想象它是什么样子,如果你使用inhenritance有超过50班......这将是地狱,没有任何逻辑,那将是非常复杂的,如果你不得不改变使用的组件在一类被其它几个类延长。
为了维护支持的原因,避免使用继承。 正如你所说,“一栏是不是富”,所以酒吧不应扩大美孚。 为了什么我都经历过,继承是从来没有一个很好的解决方案,并应(例如使用复合模式时)为家庭类只使用。
让我们从基础知识,你必须了解类最重要的事情开始,一个子类是永远也超的完整实例。 所以,如果你在一个超类定义一个字段变量,这个领域始终如果您创建一个子类的实例创建。 您可以使用super.getVariable()来获取该变量在子类中重用的字段(类变量,字段标志,这是在面向对象编程的所有同样的事情)。 但你也可以叫subclassInstance.getVariable()从外面,你会得到相同的字段(没有任何必要通过一个子类来改变它)。 所以你往往不从外面需要在子类都称之为“超级”,因为你通常只是想获取/设置字段的它的超类(包括抽象类!)。 既然你应该始终设置字段变量为私有,我总是建议从来没有所谓的“超级”来访问任何字段变量(因为即使具有超强您无法访问您的超类的私有方法/场......其实最大的一个错误在Java中,因为它不能提供对其他类的类树的完整封装...所以你需要调用通常protected
方法,如super.getField(),这是小麻烦,但necessairy)。
现在,让我们开始用数据模型:你有MODELA和modelB。 你可以从一个超类,或者只是从Object继承他们。 但是如果你只从Object继承,你可以定义一个简单的(Java的!)接口,并实现该接口到MODELA和modelB。 然后你只需通过接口处理这两个类(他们都是“界面对象”,可以统称处理)。 如果你有modelC由MODELA和modelB的,你只需要使用内部modelC这两种模式的一个实例(有时也称为“解引用”),则无需更多的代码。 所以,你可以选择这款车型作为小而简单越好(“豆”)。 基于组件的实现,这对数据结构的常用方法。
如果你有GUI的或形式,它看起来不同。 你可能有很多共同点的代码,而你不想分裂在几十个不同类别的验证码起来,然后在控制器/主持人类的组件拉在一起。 所以,你可以定义一个抽象类,它包含了所有共享的字段/标志和几个方法来访问和改变他们。 然后,你可以调用从FORMA和formB这些常见的方法和重用的代码。
请问集理论和你说什么? 您将两个圆圈,A和B,A和B的交集抽象类是路口,子类形式和formB在设定的差异。 学习码是否正确programms的......是理解集合论。 ;-)
要说起来,你的话:最形式美孚将成为一个抽象超Foobar的代码,这个类将能够处理A和B。 然后,你继承form Foo和从它的形式栏 ,而C可能会大多还停留Foobar的一个子集,您可以添加在酒吧的hability处理C,这就是差集。
最终, 酒吧会不会美孚在任何时候,他们都将是唯一的Foobar。 你得到了一些新的共享域/标志? 没问题,你自己的代码迁移到Foobar的 ,你可以在两个子类中使用它!
但是,如果有一天你需要第三个组件FooToo比富略有不同? 没问题,让FooBarFoo一个抽象类扩展FooBar的 ,然后创建Foo和FooToo作为子类。 最终的结果将是一个分类,其中根(一般)抽象类,和叶子是真正的类,这种结构提供的代码重用最大化(和不改变类名,所以你不需要改变任何其他代码alreay使用类Foo)。
你说,你要实现的setter /吸气到您的形式(或主持人)? 然后,你还必须使用MODELA和modelB(但由于C中没有modelC在酒吧 ,而不是富只用)的模型。 这些模型被用作包装器Foo和酒吧之间传输数据。 而这个数据流应该由主持人,而不是富或酒吧进行控制。
所以你的问题最终是这样的:什么是关于主持人呢? 事实上,主持人是运行GUI组件和数据模型的代码。 这是“帧”,它利用了GUI组件的一方面,并使用该数据模型的的getter / setter在另一方面。 这两个层中,GUI层和数据层,甚至不同的GUI组件和不同的数据模型之间的中间件。
所以,通常只有两种方法如何做到这一点:没有主持人/控制器或与它。 如果没有,你将需要大量的Swing组件的代码复制粘贴到您的演示类。 所以呢? 对,没错,当你使用Swing组件,你总是已经使用(M)VP模式,这是不可能做到这一点不同!
所以说,建立一个框架,你需要使用一个组件的设计,因为你要到一个程序员的框架内工作提供最大化的灵活性。 但是,生产系统是不一样的框架,这是很多程序员的框架认为错误。 所以,如果一个程序员框架告诉你“基于组件的实现就是一切”,那么,他可能是错的。 只是因为他是节目为他的框架组件,这并不意味着你需要为你的演讲做同样的!
所以,当我们开始谈论GUI组件与GUI演示文稿的。 它可以创建“尽可能多的主持人组件可能”,因为你可以采取一个简单的HTML网站,并利用该方法使数十PHP的网站出来的,它“包括(......)”。 但我可以向你保证,基于组件的设计并不总是提高了代码的可维护性! 如果我可以只用一类的东西,我能做到清晰可读,我就相当与一类去,而不是十。 一个演示者=一类,或者更具体:一个GUI框架/选项卡=一个类。
再次,如果你有2个相似的帧/标签,但他们不一样,该怎么办? 迁移共享码成一个抽象类,并创建子类2,是吗? 不,你首先要想想那些GUI的份额。 有他们共同的标志吗? 因此,移动标志为一个抽象的超类。 但是,他们只是表现有什么不同? 好了,你只需要实现同一类内的两个不同的方法,而你打电话给他们时,你需要他们。 这是最重要的。
说出来你的话:该GUI 前S1采用美孚 , 酒吧 ,A,B和C一起。 而GUI 前S2 仅在另一个类,如果有不同的标志。 否则,你将设置一个标志前S1和前S2标志和检查方法,这里面的标志。 由if(flag="Pres1"){} else if(flag="Pres2"){}
这样,你就会了最大的灵活性和代码重用得到。
别看Java类的东西不易伸缩的,不可再的,不可改变的。 一旦它的需要,你要直观地改变你的PROGRAMM的结构,如果你是一个优秀的程序员。 你并不需要考虑的人工概念,你只需要了解面向对象的编程模式。
“分量”总是意味着“与构造函数的东西”。 但是,有时候你只使用一个方法,而不是一个组成部分的做一些事情! 所以,如果有人告诉你“组件设计就是一切”,他告诉你“的基础构造设计everyhing”。 但是,创建构造函数,你需要有字段变量/标志! 如果没有字段变量,它是完全胡说八道创建一个新的类,只是为了它的缘故。
注意:“分量”是指不是方法。 很明显,你会使用大量的方法您的GUI类(ES)处理里面的东西很容易,所以最后你只需要调用几个方法。 所以,不要混用的组件和方法! 我总是建议强大的面向对象方法设计,因为它是所有关于使用较少的代码行。 所以定义为许多方法,你可以......也一样都不能少类/组件,你可以。