代码之家  ›  专栏  ›  技术社区  ›  Tenten Ponce

在全球范围内,将所需数据(通过API传递)的附加放在哪里?

  •  0
  • Tenten Ponce  · 技术社区  · 7 年前

    清洁架构问题

    我有很多表格 activities 有1个公共数据必须在提交过程中附加,我的问题是,逻辑必须放在哪里?

    域还是表示层?

    用于演示:

    我将创建一个 BaseFormActivity 有一种将所需数据插入 form 那是 BaseForm 其中包含全局所需的数据。

    基本形式 :(以各种形式扩展)

    public class BaseForm {
       private String globalData;
       //getter setters...
    }
    

    BaseFormPresenter:

    public class BaseFormPresenter extends BaseFormMvpView {
       private final GetGlobalDataInteractor mGetData; //to be injected, this is a use case
    
       public void getGlobalData() {
          mGetData.execute()
             .subscribe(data -> {
                 getMvpView().showGlobalData(data);
              }); //just for the sake of simplicity
       }
    }
    

    基本活动: (由处理表单的所有活动扩展)

    public abstract class BaseFormActivity implements BaseFormMvpView {
       @Inject
       BaseFormPresenter mPresenter;
    
       //onCreate(), etc
    }
    

    具体活动: (扩展BaseFormActivity)

    public class SpecificFormActivity extends BaseFormActivity {
    
        private SpecificForm mForm; //extends BaseForm
    
        //onCreate(), etc
    
        @Override
        public void showGlobalData(String data) {
           mForm.setGlobalData(data);
        }
    
        //then ill just call the presenter to get the global data before submitting
    }
    

    对于域:

    提交指定的中介: (抱歉编码,这只是我想做的事情的一种表述)

    public class SubmitSpecificFormInteractor extends SingleUseCase<Return, Param> {
    
        //to be injected
        GlobalRepository mGlobalRepository; 
        SpecificFormRepository mFormRepository;
    
        //some initialization
    
        public Single<SomeResponse> buildObservable(@NonNull String specificFormData, String anotherSpecificFormData) {
           return mGlobalRepository.getGlobalData()
              .map(globalData -> SpecificFormDto.create(
                    specificFormData, anotherSpecificFormData, globalData)) //create the dto then append global data
              .flatMap(specificFormDto -> mFormRepository.submit(specificFormDto)) //then submit data
        }
    }
    

    我想把它放在 域层 (你可以看到这是非常孤立的,但我必须在所有提交的表单上都这样做,这是冗余的),但我仍然只想 使我的决定可靠 . 重构非常耗时 . 希望您理解我的观点,特别是关于伪代码之类的编码。如果有什么难以理解的地方,请随时发表评论。非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   plainionist    7 年前

    在干净的体系结构中,所有业务规则都交给用例交互者。其主要目标是保持业务规则独立于任何细节——任何框架——包括android。

    然后,Clean体系结构使用“接口适配器”(在UI部分中称为“控制器”和“演示者”)在最方便内圈的数据和方便框架的数据之间进行映射。

    所以在你的情况下,你应该选择你的第二个建议——即使这意味着你必须从多个地方调用交互者,并且必须映射一些数据类型。这是值得的好处(业务规则没有细节)。

    有关用例交互者、控制器和演示者的更详细讨论,请参阅我的帖子: https://plainionist.github.io/Implementing-Clean-Architecture-UseCases/ 还有这里 https://plainionist.github.io/Implementing-Clean-Architecture-Controller-Presenter/