Java 通过扩展BaseActives来划分责任是一种不好的做法吗?

Java 通过扩展BaseActives来划分责任是一种不好的做法吗?,java,android,inheritance,Java,Android,Inheritance,我划分了MainActivity的职责,并尝试通过扩展基本活动(如MainActivity扩展AdBaseActivity扩展Location BaseActivity扩展FullScreenActivity扩展Activity)来保持其干净和可读性 每个活动只负责它们的命名,同时保持MainActivity设置布局和视图,并运行任务的主对象,如GameSurfaceView或它应该运行的主类。这种关于耦合和内聚的糟糕编程实践是否难以测试或从任何其他设计原则方面 与扩展BaseActivitie

我划分了MainActivity的职责,并尝试通过扩展基本活动(如MainActivity扩展AdBaseActivity扩展Location BaseActivity扩展FullScreenActivity扩展Activity)来保持其干净和可读性

每个活动只负责它们的命名,同时保持MainActivity设置布局和视图,并运行任务的主对象,如GameSurfaceView或它应该运行的主类。这种关于耦合和内聚的糟糕编程实践是否难以测试或从任何其他设计原则方面

与扩展BaseActivities相比,使用类(例如LocationController)和所有需要的生命周期方法、实例化的方法或与依赖项注入一起使用是否更好

我想知道,当需要权限时,例如DialogFragment或任何其他视图应该填充,或者返回另一个活动的结果时,如何使用活动所需的回调来维护管理器类?这些管理器类可以是其他类的成员,对活动有更深入的引用可能会导致内存泄漏,并且很难检测到这种情况是否仅限于
当管理器类处于阻止不释放活动引用的特定状态时发生

耦合是OOP中的一个基本关键,没有“通过耦合做错”这样的事情。您希望尽可能多地进行封装,每次您觉得自己在第二次编写相同的代码时,都要使用耦合

另请参考此问题,了解与您相近的主题的更多说明:

TLDR

是和否

继承和所有
OOP
原则对于可读性和代码管理非常有效,但由于您正在开发移动应用程序,过多的类可能会降低内存和性能


我明白你想做什么,为什么。不久前,我在编写一个相当大的
Android
应用程序时也遇到了同样的问题

由于它基本上是一个单一的
活动
应用程序,有4个
片段
,我的
main活动
中的代码太多了,甚至将一些代码委托给了我的
片段

然后,我更改了我的MainActivity,并通过组合使其拥有以下
Manager
类:

  • LocationManager
  • apinventormanager
  • UIManager
  • BackgroundJobManager
  • AppFunctionyManager
  • StageTransitionManager
每个包含800多行代码和生命周期回调(
onCreate()
onPause()
,…)

在那之后,我的
main活动
非常干净,组织有序,我为自己感到自豪,但我注意到性能急剧下降

然后我偶然发现了这样一句话:

然而,抽象要付出很大的代价:通常,它们需要执行相当多的代码,需要更多的时间和RAM才能将代码映射到内存中

最后,我做的是通过只维护4名
管理人员
,在抽象性能之间找到一些平衡

我会说:继续抽象,直到您注意到性能问题。这是你应该考虑限制继承和组合的时候,甚至可能重新合并以前扩展的类。


同样的原则也适用于扩展
活动
类。

这取决于目标项目。如果你想从可重用性中获益。那么这不是一个好的实践,因为分割依赖项并不容易。但如果您不打算再次重复使用代码,而且您的东西相对较少。。那么它可能没有那么糟糕,有时它是以继承方式管理逻辑的唯一方法

但是还有另一种方法。。。作文

见:

组合是
has-a
关系,而继承是
is-a
。实际上,当继承繁重时,构图是出口


使用像Dagger这样的依赖注入程序来应用
组合
将在可读性、可重用性和可扩展性方面提供高质量的代码。

老实说,我更喜欢组合而不是继承为位置、传感器、,蓝牙等等。但是这个管理者有活动的参考,这些管理者类成为其他类的一部分,进行更深入的参考,这不是很糟糕吗?此外,您还需要为这些类声明回调,这些类应该由活动实现,因为该活动会将结果转换为“我的活动”,从而导致回调过多。Activity类的角色既适用于视图,也适用于onPermissionResult()方法,这使得我很难维护它。这正是我所做的。我有一个接口
BaseManager
声明我的所有方法(
nextStage()
,…)和生命周期回调(
onCreate()
,…)。我确保我的
main活动
正在调用所有
Managers
子方法。例如:
onResume()
必须在所有
管理器中调用
onResume()
方法<代码>管理者
然后有一个对
活动
的引用。您所做的,通过在类之间划分责任,通过组合或继承,是非常好的实践。我警告过你的问题是,在移动世界中,你可能会面临硬件限制。如果这是你关心的@Fatihozcan我真正担心的是,当项目变得更大时,如果对该管理者有更深的引用,并且这些管理者有其他对象,则可能会保留对活动/上下文或其他类的引用,从而导致内存泄漏。性能更明显,可以解决,但可能存在