从Flutter到Flight 6:重塑

在触摸Flutter之前,我需要完成导航器逻辑。 这不应该花很长时间。 我编写的业务逻辑仅浏览单个清单,并且代码全部包含在Checklist类本身中:

这里的关键方法是:

  1. nextItem({bool branch}) ,它在清单中向前移动。 如果当前项目是一个是/否问题,则必须提供branch以告诉清单要导航的子项目集合。
  2. priorItem() ,它在清单中向后移动。
  3. playHistory() ,它将播放用户的历史记录以使导航逻辑回到所需状态。

逻辑相当复杂,因为它必须处理嵌套的是/否问题。 它是使用TDD编写的,这是我确信其实际工作的唯一方法。 有了所有这些代码,单个清单就可以在其项目之间来回导航。

但是导航器逻辑还需要能够在清单之间导航,以便可以无缝地完成从飞行前到着陆后关闭的整个飞行。 我想我可以在Book类中添加一些东西来解决这个问题。 那不应该太难

…你知道吗? Book已经足够复杂了; 我不想添加更多。 也许是一个单独的课程? 我们将其称为Navigator ,因为我喜欢与Flutter核心类创建命名冲突。 我们将需要一个Book对象,并假定第一个普通清单是导航的起点:

 导航器类{ 
导航器(this.book){
currentList = book.normalLists [0];
}
 最后一本书 
清单currentList;
}

现在我们有了一个基本的类,让我们花点时间考虑一下实现。 我想我们可以将在单个项目之间来回导航的所有工作委托给Checklist类。 Navigator类应包含对当前清单和先前清单的引用,并提供导航到新清单的方法。 当当前清单不能再返回时,它也应该向后导航到先前的清单。 我做出了一个明智的决定,过去将向后导航限制为1个清单。 我在这里的想法是,永远不需要返回多于一个检查清单,因为时间通常在向前发展,并且检查清单与时间紧密相关。 这可能会根据实际使用情况和需求进行更改。

我看到的这种设计的一个问题是NavigatorChecklist之间的切换。 现在,这两个没有互相交谈。 如何将它们集成在一起? Navigator是否应该为仅通过currentChecklist到达的当前项目提供一个吸气剂? 如果是这样,那么我开始在Checklist类中复制跟踪逻辑。 我将不得不添加吸气剂来确定Navigator是否可以在当前清单中向前或向后移动。 Checklist几乎整个公共接口都将在Navigator复制。 看来……错了。 也许我应该让Navigator仅专注于清单导航,而让Checklist专注于项目导航。 但是,如果我采用这种设计,则调用者将不得不在这两个类之间进行权衡。 每个交互都需要查看Checklist是否可以向前移动,如果不能,则切换到Navigator以移至另一个清单。 感觉有点像不必要的复杂性。 我真的想要所有事物导航的单一交互点。

gh…这两个选项都很烂…

……这对我来说是个危险信号,我可能已经搞砸了现有设计。 回顾Checklist类,使我认为我违反了“单一责任原则”。 Checklist应管理项目的集合; 它真的不应该关心这些项目的导航方式。 让我们从Checklist剥离导航逻辑,将其合并到Navigator ,并创建一个统一的类来处理所有导航。

我们从Checklist移出了moveNext()goBack()playHistory()方法来处理详细的项目导航。 goBack()修改为当我们到达当前检查清单的开头时导航到先前的检查清单。 一个名为changeList()新方法会将当前列表和导航历史记录保存到“优先级”字段中,并导航到新列表。 此类应完成我需要在应用程序中完成的所有导航活动。 更好的是, Checklist得到了极大的简化,并且更易于推理。 我能够将所有旧测试移至新测试文件,并为其他逻辑添加新测试。 一切正常,尽管仍然有进一步重构的机会,但是掌握正在发生的事情相当容易。

是的,感觉就像我在这里住的更好。 单个对象将处理所有向前和向后导航。 导航项目和清单的方法仍然是分开的,但是我认为它们必须是因为我希望我的用户能够切换到不同的,不相关的流程。 例如,如果引擎着火了,即使当前清单没有链接或引用,引擎也应该能够导航到“引擎着火”清单。 当前的设计感觉像是一种改进,因为客户端类可以使用单个对象来完成他们所需的一切。

我看到的另一个好处是,将来在导航逻辑上的工作可以完全在这一类中完成,因此将来的更改应该更容易执行。 随着时间的流逝,我可以使这种设计变得更好,而随着先前的逻辑,我认为它会随着时间的流逝变得更糟。

*哇*

现在,业务逻辑已被重塑,我可以回到Flutter世界。 我不希望使用后端代码做太多工作,但这是应用程序发展的重要一步。 下一篇文章将重点介绍如何在Flutter中创建一个页面,该页面将与Navigator交互并允许我们实际使用清单。