我使用MVP方法做了一些Android应用程序,
但是我不确定在同一个包装中放置相同功能的不同图层对象是否更好?或将包含不同功能的所有图层项目包装在同一个包中?
(我的意思是这样的)
目前,我遵循第二条规则,但这是最佳做法吗?
修改:这是我的项目的整个套餐! :)
答案 0 :(得分:6)
只是把我的想法融入其中。我曾使用这些方法开展项目。我现在的偏好是按功能打包。我更喜欢这种方法有两个主要原因:
易于归纳
增加了对代码库新手的开发人员的项目结构的可见性。当与单个特征相关的类组合在一起时,新的团队成员可以更快地看到所有内容如何组合在一起。
限制类访问权限
这可能更重要。当您按类型打包(所有演示者在一起等)时,您必须在这些类public
访问中提供许多方法。这可能导致从代码库的各个区域不恰当地使用这些函数。
如果按功能打包,则这些类都在同一个包中,因此您可以为方法提供包级访问权限。这可以确保方法不会泄漏。
答案 1 :(得分:2)
创建特定于功能的包,其中包含Contract
interface
,其中包含View
和Presenter
接口。功能包还包含View
和Presenter
接口(即Activity
和Presenter
类)的实现。
我做了sample project here;你可以参考它获取有关MVP的更多信息。
答案 2 :(得分:1)
您应该为每个MVP实体创建基本MVP类和包的单独包。说,' mvp_base'对于基本的东西和' some_screen'包,你将在其中拥有你的活动,碎片等。具体的mvp实现为'某些屏幕'放入' mvp'内包装' some_screen'包。 将所有模型和演示者存储在Service中并在创建UI时绑定到它也是一个好主意。
答案 3 :(得分:1)
我更喜欢这个包装模型在主包中:
常见课程在main。
每个包都是app或应用层的一个功能。
数据:数据层。包含用于数据的类。例如域类,存储库类,数据源类等。
如果您设计 Mvp - Clean architecture 并在Interactor
课程中开展业务。 (或Use-Case
课程)您可以在相关功能中创建domain
包,并将其放在此位置。
Util包含util类。
在名为Contract
的班级中定义视图和演示者。
以下是Contract
类的示例:
interface SupportContract {
interface View extends BaseView {
void showTenthChar(char c);
void showEveryTenthChar(@NonNull char[] chars);
void showEveryWordWithCount(@NonNull HashMap<String, Integer> data);
}
interface Presenter extends BasePresenter<View> {
void onSupportDataRequested();
}
}
据我所知,这个模型的主要好处是有人在看到包模型时可以轻松了解app的层次,功能和要求。