发表日期: 2021-04-26 09:41:49 浏览次数:78
如皋400电话申请开通【如皋企业网站建设】如皋微信公众号小程序开发运营价格、如皋微信公众号APP软件客户端设计运营、如皋网页页面设计公司费用、如皋公司网站制作方案流程改版维护大概需要多少钱
如皋市,简称“如”或“皋”,江苏省辖县级市,由南通市代管,江苏省历史文化名城。地处长江三角洲北翼,位于南通、泰州、苏州三市交界处,南与张家港市隔江相望,北与海安市、东与如东县连接、东南与南通市通州区毗邻,西与泰兴市、西南与靖江市接壤。全市总面积1477平方公里(不含长江水面),长江水面99平方千米。如皋长江岸线全长48千米,可直接利用长江深水岸线18.6千米。
如皋市被国际自然医学会评为世界六大长寿乡之一。 [1] 如皋市户籍人口约142万。截至2021年1月1日,全市80周岁以上高龄老人68031人,90周岁以上高龄老人10150人,百岁老人达525位,其中105岁以上达16位。 [2]
2019年6月17日,如皋被中华人民共和国住房和城乡建设部选取作为开展规范城市户外广告设施管理工作试点城市。 [3] 2019年10月8日,被评为2019年度全国综合实力百强县市、2019年度全国绿色发展百强县市、2019年度全国新型城镇化质量百强县市、2019全国营商环境百强县。 [4-6] 2020年12月,社科院发布《全国县域经济综合竞争力100强》,如皋排名第31 [7] 。
在以往的开发中,我都很注意对业务规则统一提取、归纳,并在必要时进行重构。这使得我可以非常相信我所提供业务的稳定性,以及在给别人讲解时的信心。例如有一次,在一个大型的系统中,需要对某个页面跳转链接的生成规则进行调整。我跟另一位新来的同事说,这个需求只需修改一处时,他仍然很惊讶地问我:“怎么可能?!”因为他看到是这么多场景,如此多的页面,怕会有所遗漏。然而,事实证明,最终确实只需要改动一处就可以了。
类似这样的URL拼接规则,我们可以这样表示:
<?phpclass Domain_Page_Helper {
public static function createUrl($userId) {
return DI()->config->get('app.web.host') . '/u/' . $userId;
}}复制代码规则出现且仅出现一次,可以说是一个知易行难的做法,因为我们总会有不经意间重复实现规则。有时会忽略已有的规则,有时会出于当前紧张的开发进度而暂且容忍,有时可能多了几步就懒得去统一。但把规则的实现统一起来再重复调用,而非重生实现,会让你在今后的项目开发中长期收益。没错,真的会长期收益。
而这些业务规则,都应该封装Domain领域业务层,并统一进行维护管理。
代码保持在同一高度
领域层关注的是流程、规则,所以当你进行用户个性化分流和排序时,不应该把底层网络接口请求的细节也放到这里流程里面。把底层技术实现的细节和业务规则的处理分开是很有好处的,这样便于更清晰领域逻辑的表达,也助于单元测试时的测试桩模拟。
不可变值
通常,我们在程序中处理的变量可以分为:值和实体。简单来说,值是一些基本的类型,如整数、布尔值、字符串;实体则是类对象,有自己内部的状态。当一个实体表示一个值的概念时(如坐标、金额、日期等),我们可以称之为值对象。明显地,系统的复杂性不在于对值的处理,而在于对一系列实体以及与其关联的另一系列实体间的处理。
如同其他语言一样,如果也在PHP遵循不可变值与无状态这两个用法,我们的接口系统乃至业务方都可以从中获益。
不可变值是指一个实体在创建后,其内部的状态是不可变更的,这样就能在系统内放心地流通使用,而无须担心有副作用。
举个简单的例子,在我们国际交易系统中有一个金额为100 RMB的对象,表示用户此次转账的金额。如果此对象是不可变值,那么我们在系统内,无论是计算手费、日记纪录,还是转账事务或其他,我们都能信任此对象放心使用,不用担心哪里作了篡改而导致一个隐藏的致使BUG。
也就说,当你需要修改此类对象时,你需要复制一个再改之。有人会担心new所带来的内存消耗,但实际上,new一个只有一些属性的对象消耗很少很少。
要明白为什么在修改前需要再创建新的对象,也是很容易理解的。首先,我们保持了和基本类型一致的处理方式;其次,我们保持了概念的一致性,如坐标A(1, 2)和坐标B(1, 3)是两个不同的坐标。当坐标A发生改变,坐标A就不再是原来的坐标A,而是一个新的坐标。从哲学角度上看,这是两个不同的概念。
在PhalApi中,我们可以看到不可变值在Query对象中的应用:
$query1 = new PhalApi_ModelQuery();$query1->id = 1;$query2 = new PhalApi_ModelQuery($query1->toArray());$query2->id = 2;复制代码
这样以后,我们就不再需要小心翼翼维护“漂洋过海”的值对象了,而是可以轻松地逐层传递,这有点像网络协议的逐层组装。
这又让我想起了《领域驱动设计》一书中较为中肯的说法:
把值对象看成是不可变的。不要给它任何标识,这样可以避免实体的维护工作,降低设计的复杂性。
无状态操作
PHP的运行机制,不同于长时间运行的语言或系统,PHP很少会在不同的php-fpm进程之间共享实体,最多也只是在同一次请求里共享。
这样,当我们在一次请求中需要处理两个或两个以上的用户实体时,可以怎么应对呢?
关于对实体的追踪和识别,可以使用ORM进行实体与关系数据库映射,但PhalApi弱化了这种映射,取而代之的是更明朗的处理方式,即:无状态操作。
因为PhalApi都是通过“空洞”的实体来获得数据,即实体无内部属性,对数据库的处理采用了表数据入口模式 。当我们需要获取两个用户的信息时,可以这样:
$model = new Model_User();$user1 = $model->get(1); //$user1是一个数组$user2 = $model->get(2);// 而不是$user1 = new Model_User(1); //$user1是一个对象$user2 = new Model_User(2);// 或者可以这样批量获取$users = $model->multiGet(array(1, 2)); //$users是一个二维数组,下标是用户的ID复制代码
这样做,没有绝对的对错,可以根据你的项目应用场景作出调整。但我觉得无状态在PhalApi应用,可以更简单便捷地处理各种数据以及规则的统一,以实现操作的无状态。因为:
+ 1、可以按需取得不同的字段,多个获取时可以使用批量获取 + 2、在单次请求处理中,简化对实体的追踪和维护 + 3、换种方式来获得不可变值性的好处,因为既然没有内部状态,就没有改变了
Domain层作为Api-Domain-Model分层模式中的桥梁,主要负责处理业务规则。将值对象与无状态操作引申到Domain层,同样有处于简化我们对数据和业务规则的处理。
我们可以根据上述的家庭组成员领域类来完成类似下面功能场景的业务需求:
$domain = new Domain_Group_Member();if (!$domain->hasJoined(1, 100)) {
$domain->joinGroup(1, 100);}if (!$domain->hasJoined(2, 100)) {
$domain->joinGroup(2, 100);}if (!$domain->hasJoined(3, 100)) {
$domain->joinGroup(3, 100);}复制代码即:如果用户1还没加入过组100,那么就允许他加入。用户2、用户3也以此类推。
当我们在领域业务层把业务规则划分为更细的维度时,就能更轻松上组装不同的业务功能,满足不同的业务场景,讲述不同的故事。
故事,因为真实,所以生动。
对于前面的示例,对于商品快照信息的获取,假设不能返回价格为0或负数的商品信息。则可以添加对价格有效性判断的业务规则处理:
// $ vim ./Shop/Domain/Goods.php<?phpclass Domain_Goods {
public function snapshot($goodsId) {
$model = new Model_Goods();
$info = $model->getSnapshot($goodsId);
if (empty($info) || $info['goods_price'] <= 0) {
return array();
}
return $info;
}}复制代码休息一下,接下来,继续探讨Model数据层。
领域层固然重要,但如果没有数据源层,领域层就是一个空中楼阁。
这里的Model层,不限于传统框架的Model层,即不应将Model层与数据库习惯性地绑定在一起。数据的来源可以是广泛的,可能来自数据库,或者来自简单的文件,可能来自第三方平台接口,也可能存放于内存。所以,PhalApi这里的Model层,则是广义上的数据源层,用于获取原始的业务数据,而不管来自何方,何种存储媒介。
我曾经在一家游戏公司任职时,就看到他们使用了文件来存放。相信,你也看到过。其次,在现在多客户端多系统的交互背景下,很多系统都需要进行数据共享和通信,为了提高服务器的性能也会使用到缓存。这些场景下,会导致数据是通过接口来获取,或者来源于缓存。可以看出,如果把数据源就看作是MySql,是非常局限的。

如皋400电话申请开通【如皋企业网站建设】如皋微信公众号小程序开发运营价格、如皋微信公众号APP软件客户端设计运营、如皋网页页面设计公司费用、如皋公司网站制作方案流程改版维护大概需要多少钱