您身边的网站建设专家
成功案例

【建站服务】庆阳申请400电话费用【庆阳企业全国热线电话办理】庆阳开通400电话电信价格、庆阳微信公众号代运营外包托管、庆阳网店编辑装修美工、庆阳网站推广优化大概需要多少钱-域名申请

日期: 2022-09-20 15:50:23 浏览数:3


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


庆阳申请400电话费用【庆阳企业全国热线电话办理】庆阳开通400电话电信价格、庆阳微信公众号代运营外包托管、庆阳网店编辑装修美工、庆阳网站推广优化大概需要多少钱

网站建设.jpg

庆阳,习称“陇东”,是甘肃省辖地级市,甘肃的石油天然气化工基地、长庆油田主产区。截至2020年7月,辖1个区、7个县,总面积27119平方公里,总人口265万,常住人口227.88万人,城镇人口90.98万。

庆阳地处中国西部地区、甘肃省东部,东接陕西省的宜君、黄陵、富县、甘泉、志丹等县;北邻陕西省定边、吴起、志丹县及宁夏回族自治区盐池县;西与宁夏回族自治区固原市原州区、彭阳县、同心县接壤;南与甘肃省的泾川县及陕西的彬州市、长武、旬邑县相连。被誉为“红色圣地、岐黄故里、农耕之源、能源新都”,素有“陇东粮仓”的美称。 [1-2] 

庆阳市是是“环江翼龙”和“黄河古象”的故乡,中国“第一块旧石器”的出土地,中华民族早期农耕文明的发祥地之一,中医药文化的发祥地、中医鼻祖岐伯的出生地,甘肃的革命老区,长庆油田的发源地。

2019年,庆阳市完成生产总值742.94亿元,同比增长5.3%。 [3]  2020年,庆阳市实现地区生产总值754.73亿元,比2019年增长4.3%。

如对用户基本信息的获取,我们添加了一个代理:

<?phpclass ModelProxy_UserBaseInfo extends PhalApi_ModelProxy {    protected function doGetData($query) {
        $model = new Model_User();        return $model->getByUserId($query->id);
    }    protected function getKey($query) {        return 'userbaseinfo_' . $query->id;
    }    protected function getExpire($query) {        return 600;
    }
}

其中,doGetData($query)方法由具体子类实现,委托给Model_User的实例进行源数据获取。另外,实现钩子函数以返回缓存唯一key,和缓存的有效时间。

这里只是作为简单的示例,更好的建议是应该将缓存的时间纳入配置中管理,如 配置四个缓存级别:低(5 min)、中(10 min)、高(30 min)、超(1 h) ,然后根据不同的业务数据使用不同的缓存级别。这样,即便于团队交流,也便于缓存时间的统一调整。

敏锐的读者会发现,上面有一个$query查询对象,这就是我们即将谈到的复杂参数的传递。

$query是查询对象PhalApi_ModelQuery的实例。我们强烈建议此类实例应当被作为值对象对待。虽然我们出于便利将此类对象设计成了结构化的使用。但你可以轻松通过new PhalApi_ModelQuery($query->toArray());来拷贝一个新的查询对象。

此查询对象,目前包括了四个成员变量:是否读缓存、是否写缓存、主键id、时间戳。很多时候,这四个基本的变量是满足不了各项目的实际需求的,因此你可以定义你的查询子类, 以支持丰富的数据获取。如调用优酷平台接口获取用户最近上传发布的视频时,需要用户昵称、获取的数量、排序种类等。

在完成了上面的工作后,让我们看下最终呈现的效果:

// 版本4:缓存 + 代理$query = new PhalApi_ModelQuery();
$query->id = $userId;
$modelProxy = new ModelProxy_UserBaseInfo();
$rs = $modelProxy->getData($query);

在领域层中,我们切换到了Model代理获取数据,而不再是原来的Model直接获取。其中新增的是代理具体类 ModelProxy_UserBaseInfo,和可选的查询类。

至此,我们很好地在源数据的获取基础上,统一结合缓存策略。你会发现: 缓存节点可变、具体的源数据可变、复杂的查询亦可变 。

图2-4 代理模式下的UML静态结构

图2-4 代理模式下的UML静态结构

将此静态结构简化一下,可得到:

图2-5 简化后代理模式下的UML静态结构

图2-5 简化后代理模式下的UML静态结构

这样的设计是合理的,因为缓存节点我们希望能在项目内共享,而不管是哪块的业务数据;对于具体的源数据获取明显也是不尽相同,所以也需要各自实现,同时对于同一类业务数据(如用户基本信息)则使用一样的缓存有效时间和指定格式的缓存key(通常结合不同的id组成唯一key);最后在前面的缓存共享和同类数据的基础上,还需要支持不同数据的具体获取,因此需要查询对象。也就是说,你可以在不同的层级不同的范畴内进行自由的控制和定制。

如果退回到最初的版本,我们可以对比发现,Model_Proxy就是Domain和Model间的桥梁,即:中间层。因为每次直接通过Model获取源数据的成本较大,我们可以通过Model_Proxy模型代理来缓存获取的数据来减轻服务器的压力。

细粒度和可测试性

细粒度的划分,对于支撑复杂的领域业务有着非常重要的作用。一来是更清楚明了的层次结构划分,二来是可测试性。

正如前面提及到的,我们在预览、调试、单元测试或者后台计划任务时,不希望有缓存的干扰。在细粒度划分的基础上,可轻松用以下方法实现而不必担心会破坏代码的简洁性。

在构造Model代理时,默认情况下使用了DI()->cache作为缓存,当需要进行单元测试时,我们可以两种途径在外部注入模拟的缓存而达到测试的目的:替换全局的DI()->cache,或单次构造注入。对于计划任务则可以在统一的后台任务启动文件将DI()->cache设置成空对象。

在项目层次,我们可以统一构造自己的查询基类,以实现对缓存的控制。

如:

<?phpclass Common_ModelQuery extends PhalApi_ModelQuery {    public function __construct($queryArr = array()) {        parent::__construct($queryArr);        if (DI()->debug) {            $this->readCache = FALSE;            $this->writeCache = FALSE;
        }
    }
}

这样便可以获得了接口预览和调试的能力。

最后,让我们继续来完成前面的商品快照信息获取的实现。为简单起见,假设我们的商品数据不存在数据库,而是固定编码在代码中,并其数据和实现如下:

//$ vim ./Shop/Model/Goods.php<?phpclass Model_Goods {    public function getSnapshot($goodsId) {
        $allGoods = array(            1 => array(                'goods_id' => 1,                'goods_name' => 'iPhone 7 Plus',                'goods_price' => 6680,                'goods_image' => '/images/iphone_7_plus.jpg',
            ),            2 => array(                'goods_id' => 2,                'goods_name' => 'iPhone 6 Plus',                'goods_price' => 4588,                'goods_image' => '/images/iphone_6_plus.jpg',
            ),
        );        return isset($allGoods[$goodsId]) ? $allGoods[$goodsId] : array();
    }
}

这里硬编码了两个商品:iPhone 7 Plus和iPhone 6 Plus。然后执行一下最初的单元测试,发现已经可以通过测试了。

$ phpunit ./Api/Goods_Test.php 
... ...
OK (2 tests, 5 assertions)

是不是发现接口服务开发,其实也很有趣?

2.3.5 ADM职责划分与调用关系

传统的接口开发,由于没有很好的分层结构,而且热衷于在一个文件里面完成绝大部分事情,最终导致了臃肿漫长的代码,也就是通常所说的意大利面条式的代码。

在PhalApi中,我们针对接口领域开发,提供了新的分层思想:Api-Domain-Model模式。即便这样,如果项目在实际开发中,仍然使用原来的做法,纵使再好的接口开发框架,也还是会退化到原来的局面。

为了能让大家更为明确Api接口层的职责所在,我们建议:

Api接口服务层应该做:

Api接口服务层不应该做:

Domain领域业务层应该做:

Domain领域业务层不应该做:

Model数据模型层应该:

在明确了上面应该做的和不应该做的,并且也完成了接口的定义,还有验收测序驱动开发的场景准备后,相信这时,即使是新手也可以编写出高质量的接口代码。因为他会受到约束,他知道他需要做什么,主要他按照限定的开发流程和约定稍加努力即可。

如果真的这样,相信我们也就慢慢能体会到精益开发的乐趣。

至于调用关系,整体上讲,应根据从Api接口层、Domain领域层再到Model数据源层的顺序进行开发。

在开发过程中,需要注意不能越层调用也不能逆向调用,即不能Api调用Model。而应该是上层调用下层,或者同层级调用,也就是说,我们应该:

如果用一张图来表示,则是:

图2-6 ADM调用关系

图2-6 ADM调用关系

为了更明确调用的关系,以下调用是错误的:

这样的约定,便于我们形成统一的开发规范,降低学习维护成本。比如需要添加缓存,我们知道应该定位到Model层数据源进行扩展;若发现业务规则处理不当,则应该进入Domain层探其究竟;如果需要对接口的参数进行调整,即使是新手也知道应该找到对应的Api文件进行改动。


庆阳申请400电话费用庆阳企业全国热线电话办理庆阳开通400电话电信价格、庆阳微信公众号代运营外包托管、庆阳网店编辑装修美工、庆阳网站推广优化大概需要多少钱


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站