在2022年9月份的更新中,我们发布了 GWA2 in Python的初始预览版本。目前该版本正在不断功能完善与改进中,即将发布生产就绪版本。在之前的Blog中,我们绘制了 GWA2 Python中的面向对象的实现,参考下图。GWA2 in Python的类与对象的继承关系( https://ufqi.com/blog/gwa2-in... )。
GWA2 in Python在上图中,实体对象类 FinanceFund 在访问路由控制器的 ctrl/financefund 中被调用。实体类FinanceFund继承基类 WebApp, 基类WebApp实现了基础接口 WebInterfance, 而基类接口WebInterface则继承了 Python原因的抽象基础类 ABC(Abstract Base Class)。如此以来,从 Python 语言视角完整地实现了类与对象的继承关系, ABC –> WebInterface –> WebApp –> FinanceFund –> FinanceFundBase …这次我们以一个从数据库中读取数据记录的实例来回顾上面这些类与对象的关系,并尝试回答为何要在软件开发过程中使用软件开发框架。下图中,GWA2 in Python 数据库读取及数据流转,
GWA2 Python数据库读取及数据流在路由控制器 ctrl/financefund 中,实例化的 FinanceFund 的对象 ffund 调用放 ffund.getInfo 试图访问数据库中的一条数据记录;ffund.getInfo 进一步地调用父类 WebApp.getBy;WebApp.getBy 根据调用参数,识别出是默认从数据库中读取;WebApp.getBy 将请求分发给 Dba, Dba被激活并初始化——使用哪个连接服务,使用哪种数据库驱动接口;Dba.select随之被调用;根据所选连接及数据库驱动接口程序进行下一步;MySql数据服务及接口程序被选择并调用,MySql.readSingle 被调用;MySql.readSingle 触发内置的 mysql.connector 相关的方法读取数据并返回:数据按之前的流程逐步向上顺序返回,直至最终抵达 路由控制器 ctrl/financefund 那里。这里令人不能直观而形象地理解的是,为何要经过这么繁琐的过程进行数据记录的读取?实际上,在路由控制器 ctrl.financefund 中直接引入 mysql.connector 并根据相关指令语句完成,填入服务主机信息,创建连接,组装SQL,递交查询,解析数据,返回数据….这样也是可以的,直接写更容易理解,也可能速度上因为少了类与对象的封装、数据流转步骤而稍微快一些。
这实际上要回答为何在软件开发过程中要使用开发框架。简而言之,软件开发框架是一种代码开发、组织与管理的方法。软件开发框架是以极大地提高软件开发效率、运行效率,同时降低软件维护成本、总持有成本为目标的。在开发层面,代码需要复用,同样功能的代码,只需写一次即可在整个软件中调用;在组织层面,使用面向对象的方式,尽可能地映射完整的物理世界的分类与层级:在运行层面,提供便捷的配置,可接受的安全性、健壮与鲁棒性:在维护扩展层面,可方便纵向升级优化,可便利地横向扩展;…..
为了更好地开发软件、组织和管理软件代码,我们需要遵循一定的开发规范和规则,这些规范和规则,以一种成套系的形式呈现出来的,就是软件开发框架。比如,当我们可以在 ctrl/financefund路由控制器中写数据库连接的账户信息时,我们不那么做,是由于这些敏感信息不应该散落和分布在各个路由控制器中,既有安全隐患,也不利于集中统一管理,假如未来某一天需要更换/切换某个数据库的账号信息时,不能逐个文件的一一进行修正。
我们不在每个路由控制器中建立对数据库的连接,还由于这些代码与其他路由控制器是重复的,不应该同样的代码重复不断的复制着写。同时,我们还要考虑数据库连接可能要有连接的复用,连接池的管理与调度等问题。
再次,我们不在路由控制器中写入建立数据库的连接,还要考虑在未来某一天我们切换某个数据库连接时,需要修改每一个路由控制器文件,这是一种繁琐且容易出错的过程,应该极力地避免。第四,我们还要考虑,如果未来面对变化,我们从A类数据库切换到B类数据库时,程序是否能够正常、无缝地运行下去。
反之,如果我们提前规范了这些开发行为,提前预留和相应的操作空间,则上面的任何层面的改动,对下游依赖不构成影响。我们可以在配置文件中,轻易地修改数据库账号信息,下游所有的程序无需做任何改动;我们可以在数据库连接中,轻易地复用数据库连接,进行复用,甚至多个数据库进行轮询;我们可以轻易地的将同类的A数据库切换为A类另外一个数据库;我们可以轻易地地将A类数据库切换为B类数据库;….
这些相对完整、完善的高可用、可扩展、可升级的设计思想及相应的软件代码的实现,构成了软件开发框架。读取数据库是最常用的场景之一,实际上,GWA2 在设计和代码实现中,不但考虑到数据库,还考虑到比如缓存、文件、网络等各种外部资源的调用。针对这些外部资源的使用,都遵循了与数据库读取相似的逻辑,下图是 GWA2 内置缓存的处理逻辑与数据流转过程。
GWA2 内置缓存控制器( https://ufqi.com/blog/gwa2-ja... )。
GWA2 built-in CacheGWA2 支持更多数据库连接控制器( https://ufqi.com/blog/gwa2-fi... )。
GWA2 with multiple databasesGWA2支持更多文件系统及驱动的接入。
GWA2 Multiple File Systems从上述描述可以看到,针对各种外部资源,GWA2 在操作过程中,某个继承了基础父类 WebApp 的实体对象类在运行中,读取方法 WebApp.geyBy 根据参数决定调用哪种外部资源,然后相应地外部资源管理器被激活调用,如Dba, Cachea, Filea 等等。当资源管理器被激活调用时,需要识别使用哪种驱动程序连接到那个主机服务上去。相应的资源驱动程序被调用,通过统一的接口方法进行实际的资源读取。与读取方法类似, 基础父类 WebApp.setBy 则是将相应的数据写入到外部资源中去。全文首发地址: https://ufqi.com/blog/gwa2pyt... , -R/V2SX
GWA2吉娃兔-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architecture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,也包括各种企事业单位网上门户,在线交互及服务作业系统等.还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .
-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.Moreover it contains server-side support for Native App, or even all of the WebApp.-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.
-GWA2 is E.A.S.Y Easy Along, Swift Yield轻松启动, 快速产出.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。