当前位置: 网站首页>小程序开发>小程序制作

泰州网站制作【泰州网站优化】泰州建网站、泰州微信公众号运营、泰州网页设计、泰州微信小程序商城

发表日期: 2021-04-25 10:49:05 浏览次数:104

泰州网站制作【泰州网站优化】泰州建网站、泰州微信公众号运营、泰州网页设计、泰州微信小程序商城


泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区27城之一 [1]  ,国务院批复确定的中国长江三角洲地区重要的工贸港口城市 [2]  。截至2018年,全市下辖3个区、代管3个县级市,总面积5787.26平方千米,常住人口463.57万人,城镇人口305.96万人,城镇化率66.0%,全年实现社会消费品零售总额1282.87亿元。 [3] 

泰州地处中国华东地区、江苏中部,是扬子江城市群重要组成部分,南濒长江、北邻盐城、东临南通、西接扬州,是承南启北的水陆要津,为苏中门户,自古有“水陆要津,咽喉据郡”之称。700多年前,马可·波罗游历泰州,称赞“这城不很大,但各种尘世的幸福极多”。 [4] 

泰州是国家历史文化名城,秦称海阳,汉称海陵,州建南唐,文昌北宋。南唐时(公元937年)为州治,取“国泰民安”之意,始名泰州。泰州人文荟萃、名贤辈出,“儒风之盛,素冠淮南”。王艮、刘熙载、施耐庵、郑板桥、梅兰芳是泰州文化艺术史上的杰出代表。 [4] 

泰州所辖县市(区)全部建成国家级生态示范区、全国百强县,同时泰州也是全国文明城市 [5]  、国家环保模范城市 [6]  、国家园林城市、中国优秀旅游城市、全国科技进步先进市、第一批国家农业可持续发展试验示范区。2017年中国地级市全面小康指数排名第42 [7]  。

2018年11月,入选中国城市全面小康指数前100名。 [8]  12月,被评为2018中国大陆最佳商业城市100强。2020年10月9日,被生态环境部授予第四批国家生态文明建设示范市县称号。2020年10月,被评为全国双拥模范城(县)。


c2/9/SoundexTest.cpp

   TEST(SoundexEncoding,RetainsSoleLetterOfOneLetterWord){
      Soundex soundex;

      auto encoded = soundex.encode("A");➤    ASSERT_THAT(encoded, Eq("A000"));
   }复制代码

如上述代码所示,让第一个测试通过并不难!

现在有两个大体相同的测试,只是数据稍微有点差别。这没关系。每个测试分别描述一种行为。我们不仅要确保系统按预期工作,还要让每个人知道所有既定的系统行为。

是时候重构了。encode()中的代码在描述其中可能发生的操作时有点模糊其词。我们决定提取独立的方法(Method),配以意图明确的名字。

c2/10/SoundexTest.cpp

   public:
      std::string encode(const std::string& word) const {➤       return zeroPad(word);
      }

      private:➤       std::string zeroPad(const std::string& word) const {➤          return word + "000";➤       }复制代码

fixture与设置

在重构的时候,不仅要审阅产品代码,还要审阅测试。如上所述,我们的测试都需要创建Soundex类实例,并且使用相同的代码。我们不乐意看到此类貌似无关紧要的重复代码。这些重复会积累得很快,并且通常会演变为更复杂的重复代码。这也会让测试变得有点主次不分,对于阅读代码的人来说,这会分散注意力,从而忽视真正需要关注的重要内容。

相关测试拥有一些共同的代码是常见的。Google Mock允许我们定义一个fixture类,我们可以在这个类中为相关的测试声明函数和数据。(从技术角度说,所有的Google Mock测试都使用一个由Google Mock自己生成的fixture。)

c2/10/SoundexTest.cpp

➤ class SoundexEncoding : public testing::Test {➤ public:➤    Soundex soundex;➤ };➤ TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {
      auto encoded = soundex.encode("A");

      ASSERT_THAT(encoded, Eq("A000"));
   }➤ TEST_F(SoundexEncoding, PadsWithZerosToEnsureThreeDigits) {
      auto encoded = soundex.encode("I");

      ASSERT_THAT(encoded, Eq("I000"));
   }复制代码

我们在上述代码中创建了一个名为SoundexEncoding的fixture(必须从::testing::Test继承)。这样,创建Soundex类实例就在一个地方完成了。在fixture内部,我们声明了公共成员变量soundex,以便测试可以访问。(如果你对暴露变量soundex有点担心的话,记住fixture类只在这个.cpp文件中。我们想避免在测试中加入多余的杂乱代码。)

Google Mock会在运行每个测试时创建fixture类实例。在Google Mock运行RetainSole- LetterOfOneLetterWord前,它先创建一个SoundexEncoding类实例。在运行PadsWithZeroTo- EnsureThreeDigits前,创建另外一个SoundexEncoding类实例。为了使用自定义的fixture,我们把TEST宏替换为TEST_FF表示fixture。如果忘记使用TEST_F,任何使用了fixture类成员的测试代码都会编译失败。

现在,可以删掉测试内的局部变量soundex,因为每个测试都可以访问fixture中的成员。我们增量地作出这些代码改动。在定义完fixture类并修改宏处理后,我们从第一个测试中删掉局部变量soundex。运行所有的测试来验证这个改动,继而删掉第二个测试中的局部变量soundex,然后再次运行所有的测试。

去掉测试中重复的Soundex类实例定义至少会产生下面两个影响。

  • 提升了测试的抽象度。现在,每个测试中只包含两行代码,这有助于我们集中精力关注与测试相关的东西。我们也看不到Soundex类实例是怎样构造出这一不相干的细节的。

  • 可以降低未来维护测试的开销。试想一下我们必须改变Soundex类实例的构造方式(譬如我们需要能够将语言种类作为一个构造函数的参数)。将Soundex类实例的构造放到fixture中,这意味着改动一个地方即可。否则,要改动每个测试。

每个测试只有两行代码,这让测试更具可读性。还可以做些什么呢?我们可以让每个测试只有一行代码,同时保持可读性。另外,我也不是显式使用using指示符的拥趸,所以也可以去掉它。

c2/11/SoundexTest.cpp

   #include "gmock/gmock.h"➤ #include "Soundex.h"➤ using namespace testing;➤ class SoundexEncoding: public Test {
   public:
      Soundex soundex;
   };

   TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {➤    ASSERT_THAT(soundex.encode("A"), Eq("A000"));
   }

   TEST_F(SoundexEncoding, PadsWithZerosToEnsureThreeDigits) {➤    ASSERT_THAT(soundex.encode("I"), Eq("I000"));
   }复制代码

从上述代码中可以看到,测试仅仅引用了Soundex.h头文件。短期内,测试和产品代码同在一个文件是有益的。但现在,我们需要在一个文件中不断地拉上拉下,所以有点费力。先把测试和头文件分开(稍后再决定是否应该创建.impl文件),下面是头文件。

c2/11/Soundex.h

➤ #ifndef Soundex_h➤ #define Soundex_h
   #include <string>

   class Soundex
   {
   public:
      std::string encode(const std::string& word) const {
         return zeroPad(word);
      }

   private:
      std::string zeroPad(const std::string& word) const {
         return word + "000";
      }
   };➤ #endif复制代码

思索与测试驱动开发

简单地说,TDD的周期就是写一个测试,先确保测试失败,然后编码让测试通过,接着审阅代码和打磨设计(包括测试的设计),最后确保所有测试依然通过。在一天的工作中,你不断地重复此周期,保持周期短小,以便得到最多的反馈。虽然是重复,但绝非盲目,每一个周期你都需要思考很多事情。

为了保持事情持续推进,假定你遵从了上面提到的步骤,我只会偶尔提醒一下。你可以在显示器边上贴一个便签用作提醒。

在下一个测试中,我们将处理规则2(即在第一个字母后,用数字替换辅音)。替换规则表中说字母b对应数字1。那就先写个这样的测试,如下:

c2/12/SoundexTest.cpp

   TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {➤    ASSERT_THAT(soundex.encode("Ab"), Eq("A100"));
   }复制代码

不出意料,测试失败了。

Value of: soundex.encode("Ab")Expected: is equal to 0x80b8a5f pointing to "A100"
  Actual: "Ab000" (of type std::string)复制代码

如大部分要写的测试一样,对应的解决方案可能枚不胜举,但可能只有少量是合理的。从技术角度讲,唯一要做的是让这个测试通过,然后打磨我们的解决方案。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

泰州网站制作泰州网站优化泰州建网站、泰州微信公众号运营、泰州网页设计、泰州微信小程序商城

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878