庆阳哪家网络公司好呢?【庆阳企业网站百度 SEO 推广公司】庆阳做网站开发的价格是多少?庆阳淘宝店铺的开店、装修设计以及运营情况如何?公司网站制作的方案流程是怎样的?改版维护费用是多少?庆阳高端企业网站页面制作设计的专业公司需要花费多少钱?
庆阳,通常被称作“陇东”。它是甘肃省所管辖的地级市,也是甘肃的石油天然气化工基地以及长庆油田的主产区。到 2020 年 7 月为止,它下辖 1 个区和 7 个县,总面积为 27119 平方公里,总人口有 265 万,其中常住人口为 227.88 万人,城镇人口为 90.98 万。
庆阳位于中国西部地区且在甘肃省东部。它东边与陕西省的宜君县、黄陵县、富县、甘泉县、志丹县等相接;北边与陕西省的定边县、吴起县、志丹县以及宁夏回族自治区的盐池县相邻;西边和宁夏回族自治区的固原市原州区、彭阳县、同心县相接壤;南边与甘肃省的泾川县以及陕西省的彬州市、长武县、旬邑县相连接。被称作“红色圣地、岐黄故里、农耕之源、能源新都”,向来有着“陇东粮仓”的美誉。
庆阳市是长庆油田的发源地。
2020 年,庆阳市实现的地区生产总值为 754.73 亿元,相较于 2019 年增长了 4.3%。
继续获取商品快照信息接口服务,我们能够利用提供的脚本命令迅速生成测试骨架。其用法具体如下:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号" style="box-sizing: inherit; border: 0px; margin-top: 0px; margin-bottom: 1.1em; padding: 0px; font-family: monospace, monospace; font-size: 0.9em; white-space: pre-wrap; position: relative; border-radius: 4px; color: rgb(21, 40, 68); background-color: rgb(255, 255, 255);">将执行结果输出到./Api/Goods_Test.php 文件中</pre></p>
温馨提示:若要了解脚本命令的使用,详细内容请查看 3.5.2 -命令。
主要生成了 Goods.接口服务对应的测试骨架代码,接着将其保存在文件./Api/.php 中。之后,对生成的测试代码进行了稍微的修改和完善。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号" style="box-sizing: inherit; border: 0px; margin-top: 0px; margin-bottom: 1.1em; padding: 0px; font-family: monospace, monospace; font-size: 0.9em; white-space: pre-wrap; position: relative; border-radius: 4px; color: rgb(21, 40, 68); background-color: rgb(255, 255, 255);">需要加载测试环境文件,通过 require_once 函数来加载,加载的文件路径为 dirname(__FILE__). '/../test_env.php';调整测试环境文件的加载。 // 进行商品相关的测试操作,如测试快照等。 public function testSnapshot()
3. 形成完整的请求 URL。
$url 的值为 'service=Goods.Snapshot' 。
$params 是一个数组,其中包含了一个键值对,键为 'id',值为 1。
首先执行请求;然后进行下一步操作;接着执行请求的相关步骤;之后继续执行请求的内容;最后完成请求的执行。
$rs 被赋值为 PhalApi_Helper_TestRunner 调用 go 方法的结果,go 方法的参数为 $url 和 $params;可以输出 $rs 的内容。
//Step 3. 验证
断言 $rs 不为空;断言 $rs 具有键 'goods_id';断言 $rs 具有键 'goods_name';断言 $rs 具有键 'goods_price';断言 $rs 具有键 'goods_image'。
}</pre></p>
上面的单元测试按照构建 - 执行 - 验证模式,针对商品 ID 为 1 的信息展开验证,主要验证其是否包含这四个字段,分别是、、、。
试执行一下此单元测试,明显是失败的。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号" style="box-sizing: inherit; border: 0px; margin-top: 0px; margin-bottom: 1.1em; padding: 0px; font-family: monospace, monospace; font-size: 0.9em; white-space: pre-wrap; position: relative; border-radius: 4px; color: rgb(21, 40, 68); background-color: rgb(255, 255, 255);">使用 phpunit 对./Api/Goods_Test.php 进行测试。
.F
There was 1 failure:
PhpUnderControl_ApiGoods_Test 执行 testSnapshot 操作。
断言一个空值不是空的这一行为失败了。
在 /path/to/Shop/Tests/Api/Goods_Test.php 文件的第 56 行</pre></p>
温馨提示:的安装请参考安装 。
到这里,我们讲述了一个故事,这个故事是失败的。之所以说它失败,是因为这个故事讲不下去了。不过,我们清楚错在何处。若要让这个故事讲得通,我们可以先做一件事,那就是简单模拟一些数据,也就是先讲一个假故事。
修改Goods.接口服务的源代码,返回以下模拟的商品数据。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号" style="box-sizing: inherit; border: 0px; margin-top: 0px; margin-bottom: 1.1em; padding: 0px; font-family: monospace, monospace; font-size: 0.9em; white-space: pre-wrap; position: relative; border-radius: 4px; color: rgb(21, 40, 68); background-color: rgb(255, 255, 255);">// $ vim ./Shop/Api/Goods.php
商品图片为“/images/iphone_7_plus.jpg”。
);
}</pre></p>
此时再运行单元测试能够通过。到这一步,尽管我们最终还未完成接口服务的开发,但已极为接近。因为我们已给使用方提供了在线接口说明文档,现在又有了一份模拟的接口返回数据,即便这数据是假的。这些文档和模拟数据都能帮助客户端完成主流程的业务功能开发。
接下来,让我们进一步,把这个故事讲得真实些,动听些,丰满些。
还记得我们的 Api 层的职责吧?Api 层主要承担着请求响应这一任务,同时还会进行决策以及高层的调度。以下是 Goods 接口层调整后的代码实现:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号" style="box-sizing: inherit; border: 0px; margin-top: 0px; margin-bottom: 1.1em; padding: 0px; font-family: monospace, monospace; font-size: 0.9em; white-space: pre-wrap; position: relative; border-radius: 4px; color: rgb(21, 40, 68); background-color: rgb(255, 255, 255);">// $ vim ./Shop/Api/Goods.php
公共函数 snapshot() 。
创建了一个名为$domain的对象,这个对象是 Domain_Goods 类的实例。
$info 等于 $domain 对 $this->id 进行快照操作的结果;返回 $info 。
}</pre></p>
根据客户端传递的商品 ID,将具体的快照信息提取工作委托给领域业务层去做,之后把结果返回给客户端。
那么什么是领域业务层呢?
2.3.3 专注领域的业务层
很多框架注重性能,却不在意人文;很多项目重视技术,却不留意业务。
复杂的领域业务在项目中未得到良好体现和描述,也缺乏统一规则,且没有释意接口。这最终致使在“纯面向对象”框架内出现凌乱的代码编写,给后期的维护扩展、升级优化带来极大阻碍。框架只将注意力放在性能上,项目只对技术予以关心。然而,项目却不幸地丧失了演进的权利,逐渐地行动艰难,最终陷入了那种一处变动就会牵动全身的困境。
很多人不知该如何应对和处理领域业务,而领域业务和单元测试都很重要且被广泛推崇。就像我们表面知道单元测试却没真实接触过,一旦要编写一行单元测试代码就更迷惑了。
在一个项目架构中,存在三个主要模型。其中有设计模型,在进行选择时它已大致确定。还有领域模型,此模型需要项目干系人员进行消化、理解并表达。另外有代码模型,对于开发人员来说,它是表达的媒介。所以在这一层,主要关注的是对领域业务规则的处理。我们先把外界客户端接口调用的签名验证、参数获取、安全性等问题放在一边,不考虑数据的来源以及存放位置,重点关注对领域业务数据的处理。
有趣的开发体验
我曾进行一个接口项目开发,期间与 iOS 资深开发同学@Aevit 有过有趣的编程经历。那时我们在为 F 项目一同开发第三方联登的接口服务。因为 Aevit 首次接触 PHP 开发,且是初次接触开发,他参考我编写的微信登录后,迅速交付了微博和 登录这两个接口服务。
他的速度并未令我惊讶和兴奋,令我惊讶和兴奋的是他所编写的代码。那代码是如此的优雅美丽,就好像是出自资深 PHP 开发人员之手。这使我再次相信,通过在 TDD 下讲述故事的方式来开发接口服务,专注于领域业务规则,不但能让代码更便于传送业务逻辑,还能让更多的同学乃至新手接受并以更高的效率产出高质量的代码。
我们将走进领域业务层的内部,接着深入去探索它的奥秘,这样就能为讲出真实、动听且丰满的故事做好准备。
表达规则
领域的逻辑是对现实业务场景的重新解释。现实的因素充满变数,并且是由人为指定的。因此,不能在计算机中简单地“推导”出领域逻辑。在项目开发过程中,需要特别将这些领域逻辑理解透彻,这样后面接手的同学就能更容易地理解和明白这些流程、限制和规则。其中一个有力的指导就是释意接口。
仔细推敲对接口签名甚至是对变量命名是很有益处的。因为名字能明确其名分,避免混淆或含糊不清。接口的作用和成效很大,后来维护项目的同学端详一个接口时,无需深入内部实现就能明白它的用意和产生的影响。比如一个系列的操作,我们可以推断出它是无副作用的。如果当时的开发者不遵守约定,并且在里面做了一些行为,那么就会引发产生“望文生义”这种推断。
简单来讲,释意接口会把“命令-查询”进行分离,会把多个操作分解成粒度更小的操作,并且在同一层面进行处理。按照《领域驱动设计》这本书的说法:
类型名、方法名以及参数名共同构成了一个释意接口(- )。这个接口的作用是解释设计意图,从而使开发人员无需考虑内部的实现方式,也不用进行猜测。
在我曾任职的一个游戏公司里,我常常依据接口的命名去推断它的作用,可往往会受到伤害。因为之前的开发人员没有遵循这些约定,当时的团队还指责我不能过于相信这些接口的命名。然而我认为,如果连自己团队的其他成员都无法相信,那我们还能相信谁呢?我们是否应该反思,是否应该考虑遵守约定进行编程所带来的好处呢?任何一个问题,都不是仅仅涉及个人的。它是一个团队层面的问题。倘若我们常常接连不断地出现一生项目方面的问题,并且还要去指责某一个人,那么我们为何不在最开始的时候就遵守约定,从而避免这些问题呢?
庆阳网络公司哪家好【庆阳企业网站百度SEO推广公司】庆阳做网站开发价格、庆阳淘宝店铺开店装修设计运营、公司网站制作方案流程改版维护费用、庆阳高端企业网站页面制作设计专业公司需要多少钱 |