关于追求精神自由的事例实现后终止的事例

Posts - 610, Comments - 29671
一直熟知单元测试的重要性,也算是了看了几本这方面的经典书籍,但是真开始上手的时候总会遇到各种各样的坎。例如,为什么总感觉自己的单元测试之间有较多的重合,为什么每个单元测试都要准备那么多依赖?有的说法是,这意味着代码设计不够好,单元测试也有问题,或者说没有使用TDD的缘故,等等。但是,现实开发过程中在这方面也颇感无力。前段时间在微博上咨询了几个问题,感觉收获不大,这次干脆整理一份需求,仔细认真向高手学习一下代码设计,单元测试,甚至测试驱动开发的方式吧。我也会准备一些礼物来感谢一部分同学的帮助。
MyDriver项目描述
我准备了一个简单而完整的需求,使用C#和Java各实现了一份,以便更多同学可以加入到这次活动中来。不过下面的说明暂时围绕C#代码开展,后文也会提到Java实现与C#的区别,不过两者基本完全一致,只有些微不同,例如命名方式。
首先,我们有一个MyDriver项目,您可以将其认为是一个网络服务的驱动程序。在实际情况下,这个驱动程序不会公开源代码,因此您不能修改这个项目里的任何代码,而只能在MyClient项目里使用它们。
MyDriver项目里唯一的核心类型便是MyDriverClient类,它有几个主要成员:
MyDriverClient(string uri):构造函数,创建一个MyDriverClient类型的实例。uri为服务器地址,在这里只是个摆设。
void Connect():连接服务器,连接后则可以进行后续操作。
void AddQuery(int queryId):向服务器端发起一个查询,标识为queryId。使用相同queryId多次调用这个方法与调用一次无异。
void RemoveQuery(int queryId):向服务器端取消一个查询,标识为queryId。如果这个查询本身并不存在,则不会发生任何事情。
void Dispose():关闭与服务器端的连接。
MyData Receive():接受一条服务器端返回的查询数据,如果没有数据,则会一直阻塞。如果连接关闭,则会返回null。
其中Connect,AddQuery、RemoveQuery和Receive由于都要和服务器端进行通信,因此都有可能会抛出MyDriverException。这些方法一旦抛出异常之后,该MyDriverClient对象则需要被视为不可用,但我们依然需要调用Dispose方法将其关闭。
MyData有两个字段,int类型的QueryID和字符串类型的Value。前者标识这条数据对应于哪条查询,而Value则是查询得到的数据,服务器端会将查询得到的数据不断推送到客户端。值得注意的是,即使使用了RemoveQuery取消了某个id的查询,但服务器端也可能已经向客户端推送了与这个id有关的数据,因此在一定时间内,Receive方法还是会得到这个id有关的MyData对象。这个时间虽然会很短,但并非不可能发生。
在调用AddQuery方法添加某个id的查询之后,服务器端首先会推送一条{ QueryID: id, Value: &begin& }这样的MyData对象,表示查询已经生效,此后再会源源不断地推送与该查询相关的数据。
在Program类型中有可执行的Main方法,可能会帮助您理解以上这些描述:
static void Main(string[] args)
var driver = new MyDriverClient(&jeffz://server:12345&);
driver.Connect();
driver.AddQuery(1);
driver.AddQuery(2);
driver.AddQuery(3);
driver.Dispose();
Console.WriteLine(&Error occurred when connect or add query.&);
Environment.Exit(1);
new Thread(() =& ReceiveData(driver)).Start();
private static void ReceiveData(MyDriverClient driver)
while (true)
var data = driver.Receive();
if (data == null)
Console.WriteLine(&Closed&);
Console.WriteLine(data);
catch (MyDriverException)
driver.Close();
Console.WriteLine(&Error occurred when receive data.&);
在Main方法中,我们先创建一个MyDriverClient对象,并添加三个查询。如果添加查询时抛出了异常,则关闭MyDriverClient并退出,否则便启动一个额外的线程轮询Receive方法,并将数据打印在屏幕上。Receive方法如果返回null,则表明连接已经断开(其他某处调用了Dispose方法)。如果Receive方法抛出异常,则将MyDriverClient对象关闭。这段程序将会输出与下面类似的内容:
3, 9448434
3, 7291394
Error occurred when receive data.
Java程序的结构与C#完全相同,区别只是命名方式有所不同。此外C#里的MyDriver项目在Java项目里则变成了myDriver包,自然您也不能修改包里的代码。
MyClient项目描述
与MyDriver对应,MyClient则是您要实现的代码(及其单元测试)。其中我已经定义了一些需要对外暴露的类型和成员,您自然也可以添加更多私有或是内部的类型和成员,但一定要保持这些公开的接口不变。
MyConnection类型是MyClient的核心部分,其中封装了MyDriverClient类的使用。MyConnection的成员如下:
ReconnectInterval:一个静态常量,两次尝试之间的间隔。
MyConnection(string[] uris):构造函数,一个MyConnection保存多个服务器的uri。
void Open():开始连接服务器。Open方法则会在额外的线程连接服务器,其调用本身会立即返回。
int Subscribe(IMySubscriber subscriber):使用一个新的QueryID订阅数据,subscriber会开始收到与此次订阅相关的所有数据。该方法返回一个int值,作为订阅的ID,可以使用Unsubscribe方法取消订阅。取消订阅后subscriber不会继续收到数据。
bool Unsubscribe(int subscriptionId):取消数据订阅,如果传入的subscriptionId有效,则返回true,否则返回false。
void Dispose():断开与服务器的连接(即调用MyDriverClient的Dispose方法)。该方法“不需要”清除所有订阅,换言之可以再次Open,每个已注册的subscriber会重新开始接受数据。
Connected事件:在每次连接成功时触发。
ConnectFailed事件:在每次连接失败时触发。
Disconnected事件:连接断开时触发。
与MyDriverClient的“抛出异常”的错误反馈方式不同,MyConnection一旦遇到各种服务器通信的失败时则会选择“重试”。例如:
调用Open方法之后,会在另一个的线程里从第一个uri开始连接。如果连接失败,则尝试连接下一个uri,如果最后一个uri也失败则重新尝试第一个uri,直至成功。两次尝试之间都需要等待一段时间(ReconnectInterval)。
MyConnection会在另一个线程里轮询MyDriverClient的Receive方法,如果抛出了MyDriverException异常,则关闭当前的MyDriverClient对象,并“立即”重新开始连接下一个uri,如果失败,则再尝试下一个(此时需要有一定间隔),连接成功后重新向各subscriber发送数据。
IMySubscriber是订阅器的接口,它有两个方法:
void OnBegin():当MyDriverClient的Receive方法收到begin数据时,则调用这个方法。
void OnMessage(string message):当MyDriverClient的Receive方法收到其他数据时,调用这个方法。
简单地说,MyConnection便是在一个额外的线程中轮询MyDriverClient的Receive方法,并将接收到的MyData对象,根据QueryID分派到对应的subscriber中。接收和分派需要使用一个缓冲区,不能阻塞。值得注意的是,如果调用Subscribe方法的时候尚未连接成功,则相当于只是注册了一个subscriber。假如已经连接了服务器,则在额外的线程里调用AddQuery方法,而Subscribe方法使用要立即返回。同理,取消订阅时使用的Unsubscribe方法也要立即返回,不能被MyDriverClient的RemoveQuery方法阻塞。
Java项目与C#类似,一些区别则是为了遵循Java的习惯,例如命名以及事件的定义方式,以及使用Closeable接口代替了IDisposable接口。
,C#和Java都有。您可以Fork项目,也可以下载到本地。最好您也可以把代码存放到某个在线的Repository中,这样我可以随时查看到您的进展,我也可以立即给您反馈。
MyClient实现中最重要的部分其实是单元测试,如果您使用测试驱动开发(TDD)亦可,但不做强求,唯一的要求便是有“足够”的单元测试。为了简化问题,您也不需要过于纠缠于一些没有描述到的边界情况,例如还没有调用MyDriverClient的Connect方法便去AddQuery会怎样,或是反复调用Open等等。我们假设所有的使用方式都是“正确”的。但是,对于描述过的情况,例如必须使用“额外的线程”,或是出错之后的重新连接,则必须正确地实现,并包含足够的单元测试。
在编写单元测试的时候,您可以使用您最喜欢的Mock类库,但请尽量使用普通的Mock类库,而不要使用基于二进制改写或其他方式实现的高级类库,如,或是。我知道它们可以Mock静态成员或是final成员,的确会有很大帮助,但是我还是希望可以了解如何通过优秀的代码设计来辅助单元测试。像或是都是不错的选择。
如果您有任何反馈,例如上面的需求有任何不清楚的地方,也请立即提出,我会做出改进。这次我打算给三位积极参与并提供较好实现的同学分别送上一本书(或是其他您想要的礼物)作为感谢。
Categories:
不知我理解的大致方向对不?还有,我不太清楚这个地方需要怎么测试:“根据QueryID分派到对应的subscriber中(在Receive线程中分派即可)”。
产品代码接口的粒度与依赖管理问题:且忽略“很是学术的1”。倘若把通信的相关抽取出来,mock之,那么如此大粒度的测试,编写起来必然会很笨重,很花费时间,渐渐的又会陷入一个小小的测试却不得不mock一堆接口的尴尬境地。该如何把握接口的粒度与依赖呢?再而,即便可以“不厌其烦”地mock,mock,mock,久而久之,多个版本的mock也相当的难以管理,倘若mock无法模拟得足够贴近真实的使用场景,那么这样测试便是“不可信”的。一份不可信的UT,边界条件考虑得再怎么周全也是枉然。
UT的管理问题:随着时间的推移,bug的显现,用例会越来越多,有些UT会失效,有些UT会重复,UT的维护也将是个难题。
case的设计问题:怎样的测试才是“足量”的呢?《Pragmatic Unit Testing》里所描述的CORRECT?然而我们似乎没有那么多的时间?
并发问题:我们要考虑并发吗?考虑吧,还是那句话:UT会很笨重,难以编写,更不要说旁人理解了。不考虑吧,UT就会悖于真实的环境,不真实的测试,值得我们信赖么?
如此种种……
,登陆后便可删除或修改已发表的评论
(请注意保留评论内容)为实现“大同”社会,从古到今有许多进步思想家和社会改革家一直在追求,请结合历史知识举几个名人的事例_百度知道
为实现“大同”社会,从古到今有许多进步思想家和社会改革家一直在追求,请结合历史知识举几个名人的事例
提问者采纳
壮有所用、弊病? 有篇文章运用了孔子的话”大道之行也。 大同社会是一个文明和谐的社会,开创一个人与自然和谐相处的大同文明,虽然礼运而大同,它最终取决于采纳东方态度的能力,因而有国家社会——所有制,不必藏于己,我们清醒的认识到只有调整人与自然对立的文明,历史的认识可以不同,公营制具有礼制的意义,礼本身具有社会化意义如道德的社会性意义,没有文明素质高尚的人类,礼法一贯交融,历史的发展可以不同,盗窃乱贼而不作。同时从事实考察、自然统一关系的学说,自然社会——礼制是一切人类社会的实质内涵,随着各国政治。”《礼记·礼运》,而礼制的社会功能一直存在的,故外户而不闭,这是历史社会观。从社会的起源和人类社会的实质内涵——自然社会看、社会的和合,是为大同. 孔子的这段话,事实也始终存在着,自然社会观是关于人类,不必为己、有组织地进行创造。选贤举能,从其特征上讲,转换思维。是故谋闭而不兴。和谐化是人类社会高级阶段的必需,大同社会——公营制,而人伦推广又何尝不是人事,它并非单一或一致的行为模式,礼制社会始终存在的。这种“天下为公”,讲信修睦,没有社会道德关系。礼制社会一般从伦理上讲的社会观、发展的社会,但更多的是人的生命本能意义,幼有所长,什么是社会体制,互为其根,至大同社会它是社会基础并且是一切社会关系文明进步之据,皆有所养,礼与社会化体制是一致的、一体化,国家社会迈向大同社会更要靠礼运大同,大同社会的一般社会关系可称为公营制,国家社会还是如此,它没有反映出我们在自然界所观察到的协调的相互关系,都要求一个依法自然系统性及系统关系的协调统一的社会,鳏寡孤独废疾者,历史社会的人事内涵意义可以不同,建立一个有秩序、“选贤举能”的社会。由于历史社会都是具体的,各得其所,社会体制终究是礼制,我们整个文明能否生存下去也就取决于我们能否进行这种变革,事实也如此,女有归,他们称之为“大同之世”,使人类社会走向互助,只有礼制才能倡导和谐的社会关系并体现这一关系,无论何种社会、社会,因此社会化体制也只能建立在此基础上才能成为可能,是社会文明进步之本,不同的历史社会表现不同。 大同就是关于人。大同社会本于自然社会观的历史社会表达、合理,在这一人类的生存环境中、繁荣的新阶段,大同社会人类将以人的生命自觉实现人与自然的融洽、科技的社会化发展。故人不独亲其亲,部落社会显然如此,由此形成的社会化体制或大同社会的公营制是包含具有的,这才是人类生存与发展的文明之路,但公营制与礼实无矛盾并且一致的,不独子其子,相互之间融洽,天下为公,相互缺一不可,而要达到这种关系就需要一种完全不同的社会和经济结构,社会关系实是社会道德关系,所以礼制社会才是一个自觉文明和谐的社会,体现了大同社会的一个内涵。礼制本是人伦,人类在这个地球世界已经无可辩驳的成为了主导,按此认识则现代物理学与东方文化殊途同归、文化,但发端是一样的,没有争斗的和谐社会、统一的,这也是不可能的?即社会化体制,因此对于社会秩序的建立,那么它应该是一种系统和谐的秩序,它也是一般的社会体制,使老有所终。货恶其弃于地也,而自然社会——礼制只是从人类社会起源和人类社会的实质内涵上而言、自然,部落社会时人与自然融合,礼运大同的社会制度称为公营制。礼制法治是一个文明社会之据、经济,表现不一样,以文明和谐的态度发展我们自身,曾有位西方学者认为现代我们的社会与现代物理学所包含的世界观并不一致;力恶其不出于身也。男有分、互为其用,是儒家学者津津乐道的理想社会,这一人伦关系总要有的吧,没有必要以征服对立的态度对待这一生存环境,必然会滋生矛盾,描绘了一个不分彼此,有体验统一自然和协调生活的艺术,但作为历史观,而伦理便是怎样的社会关系。 大同社会是人类社会化发展的历史必然,我们需要一个统一的意义。今天综观人类社会文明的发展孙中山先生什么是大同社会呢,是不可能建立一个文明祥和的社会体制
提问者评价
其他类似问题
为您推荐:
历史知识的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁(18分)在合作中实现共赢是人类一直以来共同追寻的目标。历史上合作事例有很多,根据提示,完成下列有关_百度知道
(18分)在合作中实现共赢是人类一直以来共同追寻的目标。历史上合作事例有很多,根据提示,完成下列有关
人类在哪些方面需要加强国际合作?这些原则对你的人际交往产生了怎样的启示。请以二战中的典型史实加以说明。(注意:细说历史──再认历史中的不正当合作(3)写出一战中的两大组织名称。(4分)步骤三
(18分)在合作中实现共赢是人类一直以来共同追寻的目标:反思认知──感悟正当合作的真谛(4)你认为在当今世界。步骤一,完成下列有关“合作”主题的探究任务,根据提示,举出两党合作的事例(至少两例)。 4分)步骤二:要从史实及其作用两方面来作答。(4分)(2)在人类生存与发展面临挑战的时候,国家间的合作能够化解危机和灾难:史海回眸──走进历史中的正当合作(1)国共两党历史上曾有过两次合作。历史上合作事例有很多?(举两例即可)相互间的合作应遵循哪些原则
提问者采纳
根据材料和所学知识解答如下,鼓舞了各国人民的斗志。(3)要求学生回答一战中的两大组织名称;和平共处,以及建立联合国起到了一定的积极作用。(4)要求学生回答爱当今世界人类需要在那些方面进行合作以及遵循的原则和启示;抗日战争的胜利(至少两例);互惠互利。(4分)(4)例子,加快了战胜法西斯的步伐,言之有理即正确)(2分)
试题分析;在正当合作中共同进步发展等:战争问题:本题难度适中;共同发展等,该题知识点多。点评:彼此尊重国家主权,解答该题要求学生具备一定的历史功底和扎实的基础知识,共同发展的原则,在合作中共同发展等等;环境问题;资源问题,也为联合国的建立奠定了基础;毒品问题,一战中英法俄建立的协约国集团,国共实现了第一次合作,取得了抗日战争的胜利,根据所学知识,遵循的原则和启示也要根据平等互利,进行了北伐战争。(2分)(3)三国同盟与三国协约。(任意2点即可)(2分)原则。(2分)苏美英召开雅尔塔会议;积极主动地与他人进行正当合作,壮大了反法西斯的力量,有中国史也有外国史:本题考察学生对历史上大国合作的探究的认识;平等协商。(4分)(2)国际反法西斯联盟的建立,言之有理即正确)(2分)启示,要主动树立合作意识:要树立合作意识;为打败法西斯奠定了基础,该题是开放题,历史跨度大,根据所学知识。(任意2点:(1)要求学生回答国共两党合作的两个事例,这就提醒学生在平时的学习中;壮大了反法西斯的力量,善于归纳和总结,基本推翻了北洋军阀的统治。二战时期,只要学生根据当今世界存在的问题回答合作即可,抗日战争时期国共实行了第二次合作。(2)要求学生回答二战时期国际合作的事例和作用,人类面临法西斯的共同威胁时。(任意2点;相互尊重,德日和奥匈帝国建立了同盟国集团;奠定了打败法西斯国家的基础,考察学生对历史问题的分析和探究能力,建立了世界反法西斯联盟,在头脑中对同类知识形成一个网络知识结构,意思相近就可以,雅尔塔会议对协调盟国战胜德日法西斯的步伐,大革命时期,要善于把零散的知识用线串起来;或恐怖主义问题等,美苏英召开 了雅尔塔会议
(1)北伐战争
其他类似问题
为您推荐:
共赢的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁为实现“大同”社会,从古到今有许多进步思想家和社会改革家一直在追求,请结合历史知识举几个名人的事例。
为实现“大同”社会,从古到今有许多进步思想家和社会改革家一直在追求,请结合历史知识举几个名人的事例。
急,要事例
&孙中山先生什么是大同社会呢? 有篇文章运用了孔子的话”大道之行也,天下为公。选贤举能,讲信修睦。故人不独亲其亲,不独子其子,使老有所终,壮有所用,幼有所长,鳏寡孤独废疾者,皆有所养。男有分,女有归。货恶其弃于地也,不必藏于己;力恶其不出于身也,不必为己。是故谋闭而不兴,盗窃乱贼而不作,故外户而不闭,是为大同。”《礼记·礼运》. 孔子的这段话,描绘了一个不分彼此,各得其所,没有争斗的和谐社会。这种“天下为公”、“选贤举能”的社会,是儒家学者津津乐道的理想社会,他们称之为“大同之世”。 大同社会是人类社会化发展的历史必然,随着各国政治、经济、文化、科技的社会化发展,相互之间融洽、一体化,使人类社会走向互助、合理、繁荣的新阶段。大同社会本于自然社会观的历史社会表达,自然社会观是关于人类、社会、自然统一关系的学说,曾有位西方学者认为现代我们的社会与现代物理学所包含的世界观并不一致,它没有反映出我们在自然界所观察到的协调的相互关系,按此认识则现代物理学与东方文化殊途同归,都要求一个依法自然系统性及系统关系的协调统一的社会,而要达到这种关系就需要一种完全不同的社会和经济结构,我们整个文明能否生存下去也就取决于我们能否进行这种变革,它最终取决于采纳东方态度的能力,有体验统一自然和协调生活的艺术。今天综观人类社会文明的发展,我们清醒的认识到只有调整人与自然对立的文明,转换思维,开创一个人与自然和谐相处的大同文明,这才是人类生存与发展的文明之路。 大同就是关于人、自然、社会的和合,人类在这个地球世界已经无可辩驳的成为了主导,没有必要以征服对立的态度对待这一生存环境,在这一人类的生存环境中,以文明和谐的态度发展我们自身。和谐化是人类社会高级阶段的必需,部落社会时人与自然融合、统一的,但更多的是人的生命本能意义,大同社会人类将以人的生命自觉实现人与自然的融洽,因此对于社会秩序的建立,我们需要一个统一的意义,它并非单一或一致的行为模式,这也是不可能的,必然会滋生矛盾、弊病,那么它应该是一种系统和谐的秩序,建立一个有秩序、有组织地进行创造、发展的社会,体现了大同社会的一个内涵。 大同社会是一个文明和谐的社会,只有礼制才能倡导和谐的社会关系并体现这一关系,所以礼制社会才是一个自觉文明和谐的社会。礼制社会一般从伦理上讲的社会观,而伦理便是怎样的社会关系,至大同社会它是社会基础并且是一切社会关系文明进步之据,虽然礼运而大同,但作为历史观,大同社会的一般社会关系可称为公营制,但公营制与礼实无矛盾并且一致的,公营制具有礼制的意义。礼制本是人伦,而人伦推广又何尝不是人事,历史社会的人事内涵意义可以不同,而礼制的社会功能一直存在的,自然社会——礼制是一切人类社会的实质内涵,是社会文明进步之本,礼运大同的社会制度称为公营制,这是历史社会观。从社会的起源和人类社会的实质内涵——自然社会看,社会体制终究是礼制,不同的历史社会表现不同,但发端是一样的,事实也始终存在着,无论何种社会,这一人伦关系总要有的吧,部落社会显然如此,国家社会还是如此,国家社会迈向大同社会更要靠礼运大同。由于历史社会都是具体的,表现不一样,从其特征上讲,因而有国家社会——所有制,大同社会——公营制,事实也如此,而自然社会——礼制只是从人类社会起源和人类社会的实质内涵上而言,历史的发展可以不同,历史的认识可以不同,礼制社会始终存在的。同时从事实考察,礼法一贯交融,互为其根、互为其用,相互缺一不可。礼制法治是一个文明社会之据,它也是一般的社会体制,由此形成的社会化体制或大同社会的公营制是包含具有的,什么是社会体制?即社会化体制,社会关系实是社会道德关系,因此社会化体制也只能建立在此基础上才能成为可能,礼与社会化体制是一致的,礼本身具有社会化意义如道德的社会性意义,没有社会道德关系,没有文明素质高尚的人类,是不可能建立一个文明祥和的社会体制。
的感言:当代劳模!所有人都应该向你学习! 相关知识
其他回答 (2)
孙中山先生和孔子
相关知识等待您来回答
学习帮助领域专家
& &SOGOU - 京ICP证050897号合作与共赢题库及答案(刚刚经历考试验证)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
合作与共赢题库及答案(刚刚经历考试验证)
我​前​几​天​刚​刚​通​过​这​门​《​合​作​与​共​赢​》​的​考​试​,​经​过​考​试​验​证​,​这​个​题​库​是​不​错​的​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢

我要回帖

更多关于 追求精神自由的事例 的文章

 

随机推荐