ThinkPhp。其实现通过名字对各种不同模式资源(包括代码、文件、url、数据库、表)进行了映射和自加载。使得减少了很多没有意义的中间层定义(有很多定义只是为了对应一些资源)。

">

项目模式(八)—— 自动映射和自加载系统

27 October 2019

这个想法是从近期的一个重构得来的经验。参考目标是大一使用过的 web 框架 ThinkPhp。其实现通过名字对各种不同模式资源(包括代码、文件、url、数据库、表)进行了映射和自加载。使得减少了很多没有意义的中间层定义(有很多定义只是为了对应一些资源)。

比如 url 中分了三层 <模块>/<控制器>/<方法名>,对应相应的文件及方法,用以访问到一个控制器方法。这是就是一个自动映射路由的实现。如果写过Flask等框架,你应该也感觉过被flask装饰器装饰的处理请求的函数的函数名是非常没用的吧。如果这样,将其利用起来,事情就会顺畅很多。我们说MVC中V层是显示层,理论上每个View也应定义为一个类,并用其初始化为对象。但是其使用工厂类,直接用html模板文件名构造,这也体现了这种方法(django中也如此实现)。对于M层也如此,可以不要构造。直接使用。(django这里没有这样实现,但其对M层功能定义略有不同,其实现也是很有道理的,没有好坏之分。)

分析

  1. 基础思想是:统一并利用好一切的名,让其能够直接建立映射,自动加载。目的是通过减少不必要的名称多级映射问题,减少功能很简单的仅包括映射的类定义。
  2. 一切的名包括:

    • 程序中:模块名,类名,方法名,属性名
    • 系统中:文件夹名,文件名,文件子名
    • 其他:数据库名,表名,字段名
  3. 这种方法的好处是:名称是不对等的,可以通过一些方式一对多,多对一。另外,名耦合是非常松的耦合,最终如何耦合可以完全自由决定。

小技巧

  1. 建立不同名称之间的转换,以便适应 code style 、文件系统、数据库等不同命名规范。如果多映射甚至可以专门定义一个“名类”在不同的情况下输出不同的名字。只要映射不变即可。
  2. 名中可以包含大量的信息。用“.”等分隔符分割,这些字段可以表示某种类的“种类和多个初始化参数”,这样就可以直接通过字符串构造一个类了。相当于构造一个类,实际实例化,可以自动映射到多个资源上,实现一对多。
  3. 对于构造方式有多种。1,通过某种资源构造,比如名字映射是A->B,一对多,就可以对所有的B,构造相应的A。2,使用时动态构造,参考ThinkPhp模式。
Loading Disqus comments...
Table of Contents