【问题标题】:Design pattern for creating a class with multiple methods which should be executed in an order用于创建具有多个方法的类的设计模式,这些方法应按顺序执行
【发布时间】:2023-01-02 22:02:45
【问题描述】:

我正在尝试创建一个模板类来测试 Room 迁移。 测试 Room 迁移应遵循的步骤如下。

  1. 在以前的版本中创建数据库。
  2. 用于迁移到下一个版本的用户迁移助手。
  3. 插入一些数据。
  4. 验证该数据的完整性。

    现在我创建了一个 MigrationHelper 类,它相应地实现了所有这些方法。

    class MigrationHelper {
    
     fun createDatabase(version : Int) : MigrationHelper{
           initialDatabase = migrationTestHelper.createDatabase(TEST_DB_NAME , version)
           return this
     }
    
     fun insertData(db : SupportSQLiteDatabase){
       ... 
     }
    
    }
    
    

    现在对于这个类,我目前正在使用构建器方法,以便编写测试的开发人员可以以一种清晰易懂的方式调用方法。

        @Test
        fun runMigration_78_79(){
            migrationHelper.setUp("test_db")
                .addTablesInvolved("packs")
                .createDatabaseWithData(78)
                .addMigrations(MIGRATION_77_78,MIGRATION_78_79)
                .runMigration(79)
                .cleanOut()
    
        }
    

    但由于构建器模式,任何方法都可以按任何顺序调用。这对我的实现不利,因为某些方法需要按顺序调用。 例如:可以在“addMigration”方法之前调用“runMigration”方法,因为要运行迁移,您需要添加所有涉及的迁移的数组。

    这种情况的最佳设计模式是什么?我知道我可能过于复杂了,我可以用一堆方法创建类并分别调用它们。 但我想有一个干净的方法。 谢谢你。

【问题讨论】:

  • 这回答了你的问题了吗? Java pattern to enforce methods are ran
  • @SaifAhmad 实际上没有。模板方法创建一个方法,所有按其执行顺序排列的方法都放在其中。这似乎并没有描述正在发生的顺序。
  • 模板方法模式确实强制执行方法的顺序

标签: java android kotlin class design-patterns


【解决方案1】:

当您将所有内容都放入一个构建器时,构建器模式无济于事,但您可以将您的方法拆分为不同的构建器,这些构建器反映您当前所处的状态,并且包含可以在该状态下完成的操作。

例如,你可以有一个InitialBuilder,它有一个函数setUp,它返回一个EmptyDbBuilder,然后可能包含一个函数addTablesInvolved,返回一个构建器DbWithTablesBuilder,等等。

这样您就可以完全控制在不同情况下可以调用或不能调用的函数。

【讨论】:

  • 你有什么参考吗?但这又会强制执行执行命令吗?
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多