软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

4
算法模式,在需要时输出对如何到达解决方案的解释
以下情况发生在我身上几次。 我编写了解决特定问题的算法。它工作正常,并找到正确的解决方案。现在,我希望有一个选项可以告诉算法“写出有关如何获得解决方案的完整说明”。我的目标是能够在在线演示,教程课程等中使用该算法。我仍然希望有一个选项可以实时运行算法,而无需解释。什么是好的设计模式? 示例:假设我实现了用于找到最大公约数的方法。当前实现的方法返回正确答案,但没有解释。我想为该方法提供一个选项来解释其操作,例如: Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0. a and b are both even, so we divide them by 2 and increment d by 1. Now, a=3 and b=2. a is odd but b is even, so we divide b by 2. …

4
单一职责模式对班级应该有多具体?
例如,假设您有一个控制台游戏程序,该程序具有往返于控制台的各种输入/输出方法。难道是聪明的,让他们在一个单一inputOutput类或把它们分解到更具体的类,如startMenuIO,inGameIO,playerIO,gameBoardIO,等使得每个班大约有1-5的方法呢? 同时,如果最好将它们分解,将它们放置在IO命名空间中是否明智,从而使它们更冗长,例如:IO.inGame等?

3
我应该添加库的来源而不是链接到它们吗?
我是C ++的新手,所以我不确定如何最好地处理小的依赖项(例如,脚本语言或JSON / YAML / XML解析器)。 我应该创建单独的项目并将其链接为静态库,还是仅将.h / .cpp文件放入我的主项目有不利之处? 后者似乎容易得多,因为我花了几个小时来处理不兼容的库(构建库时编译器设置不同),但是我不想以错误的方式开始学习C ++。 如果最好将它们保留为单独的库,那么我该如何最好地保持编译标志同步,以便.lib / .a文件成功链接到我的应用程序? (我目前正在使用MSVC 2015,但目标是使用XCode / clang在Mac OS X和iOS上进行编译,因此我必须处理至少3种不同类型的库(Win x86,Mac x64,ARM) )
14 c++  linking 

4
Monads解决什么编程问题?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 我读过很多文章来解释什么是单子,如何使用unit和bind工作,其中一些直接陷入类别理论,如此抽象(至少对我而言),使眼睛流血,有些人完全忽略了这些,并触及了奇怪的类比。墨西哥卷饼,盒子和什么不。 经过几周的研究和大量的油炸神经元,(我认为)我了解了Monads的工作原理。但是,还有一件事让我无法理解,实际上很少有文章涉及(IO和状态除外): 为什么? 为什么Monad重要?他们为什么如此重要?他们正在解决什么问题?那些问题只能用Monad来解决吗,或者还有其他方法吗?

4
如何在GitHub中“重新开始”?
我计划使用另一个框架等完全重写我的项目。保留旧代码(包括历史记录)作为参考会很好。避免风险,混乱和意外的最佳方法是什么? 我的想法是创建一个新分支,在那里替换所有内容并在那里运行基本的“新”版本,标记最后一个“旧”母版,然后将该分支合并到母版中。听起来合理吗?
14 git  github 

2
零停机时间部署-过渡Db模式
实现零停机时间部署也涉及到同一问题,但我需要一些有关正在考虑的策略的建议。 语境 一个基于Web的应用程序,其中Apache / PHP用于服务器端处理,而MySQL DB /文件系统用于持久性。 我们目前正在建设基础设施。所有网络硬件都将具有冗余,并且所有主网络电缆都将在绑定对中使用以实现容错。服务器被配置为具有硬件容错能力的高可用性对,并且将为虚拟机容错能力和总体性能进行负载平衡。 我的目的是我们能够在不停机的情况下将更新应用到应用程序。在设计基础架构以确保可以提供100%的正常运行时间时,我付出了极大的努力。每次应用更新会有10-15分钟的停机时间,这将是非常令人失望的。这一点特别重要,因为我们打算有一个非常快速的发布周期(有时每天可能达到一个或多个发布)。 网络拓扑结构 这是网络的摘要: Load Balancer |----------------------------| / / \ \ / / \ \ | Web Server | DB Server | Web Server | DB Server | |-------------------------|-------------------------| | Host-1 | Host-2 | Host-1 | Host-2 | |-------------------------|-------------------------| Node A \ / …

5
编写面向对象的C是否不好?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我似乎总是用C编写的代码大多是面向对象的,所以说我有一个源文件或某些东西,我会创建一个结构,然后将指向该结构的指针传递给该结构所拥有的函数(方法): struct foo { int x; }; struct foo* createFoo(); // mallocs foo void destroyFoo(struct foo* foo); // frees foo and its things 这是不好的做法吗?我如何学习以“正确的方式”编写C语言。
14 c 

1
单元测试API客户端和包装器
我一直在兜圈子,试图找出对我正在开发的API客户端库进行单元测试的最佳方法。该库具有一个Client基本上与API进行1:1映射的Wrapper类,以及一个额外的类,该类在的顶部提供了更加用户友好的界面Client。 Wrapper --> Client --> External API 我首先针对Client和编写了一系列测试Wrapper,实际上只是测试它们是否转发到操作的任何适当功能(Wrapper在上操作Client,并Client在HTTP连接上操作)。但是,我开始对此感到不舒服,因为我感觉自己正在测试这些类的实现,而不是接口。从理论上讲,我可以将这些类更改为具有另一个完全有效的实现,但是我的测试将失败,因为未调用我希望调用的函数。对我来说,这听起来像是脆弱的考验。 之后,我考虑了类的接口。测试应该验证类是否确实完成了其应做的工作,而不是他们是如何完成的。那我该怎么做呢?首先想到的是对外部API请求进行存根。但是,我担心过度简化外部服务。我见过的很多存根API的示例都给出了罐头响应,这听起来像是一种非常简单的方法,可以仅测试您的代码是否针对假API正确运行。另一种方法是模拟服务,这是不可行的,并且每当真实服务发生变化时就需要保持最新状态-感觉像是过分杀伤和浪费时间。 最后,我从程序员SE的另一个答案中读取了此内容: 远程API客户端的工作是发出某些调用-不多也不少。因此,它的测试应验证它是否发出了这些呼叫-不多也不少。 现在,我或多或少地确信-测试时Client,我需要测试的是它向API发出了正确的请求(当然,总有API会更改但我的测试继续通过的可能性-但这就是集成测试很有用的地方)。由于Client与API只是1:1的映射,因此在将一个有效实现更改为另一个之前,我的担心并没有真正适用-的每种方法只有一个有效实现Client。 但是,我仍然坚持Wrapper上课。我看到以下选项: 我对Client类进行存根处理,然后测试是否调用了适当的方法。这样,我做的与上述相同,但是将其Client作为API的替代。这使我回到了起点。再一次,这给了我测试实现而不是界面的不舒服的感觉。将Wrapper很可能使用了完全不同的客户端实现。 我创建一个模拟Client。现在,我必须决定对它进行模拟的程度-创建服务的完整模拟将花费很多精力(比库本身要付出更多的工作)。API本身很简单,但是服务却很复杂(本质上是一个对数据进行操作的数据存储)。再说一次,我将必须使模拟与real保持同步Client。 我只是测试是否正在发出适当的HTTP请求。这意味着Wrapper将通过一个真实的Client对象进行调用以发出这些HTTP请求,因此我并不是在单独测试它。这使得它有点可怕的单元测试。 因此,我对这些解决方案都不满意。你会怎么做?有正确的方法去做吗?

1
如何记录无所不在的语言?
我们公司正在将大量手动业务流程(以及相关的机构知识)转换为新的企业软件。该项目的进展非常顺利,但是随着我们的进行,很明显,业务和开发方面的术语和定义存在很多混乱。 我已经知道Evan关于形成一种普遍存在的语言的争论已有一段时间了,但这是我第一次需要正式记录它们。当我环顾四周并尝试思考在哪里/如何记录我们的UL条款时,我有点迷失了。 其他公司如何记录无所不在的语言?这只是一个Wiki风格的词典吗?是否有用于此目的的工具?

4
如何鼓励客户进行内部质量检查?
更新/说明我的客户了解他们进行内部测试的必要性,并且他/他们总是发誓他们会“做得更好”(即做某事),但那没有发生。他们没有外部测试的预算。我想我正在(模糊地,我​​承认)问什么可以灌输“尽早测试,经常测试,对目标机器的精神进行测试? 问题:如何鼓励用户花时间明确测试和报告新版本的问题,而不是在生产项目中“按需测试”。 背景:我有一个小客户,为此我编写了一套多媒体演示工具。他们是一个很好的客户,我们有着良好的关系。该项目正在进行中,并随着我们的进行添加了功能。 我有两个问题: 功能定义通常是通过电话即时进行的,可能会进行更改,修订和撤销。(有点像肯尼迪的“我们将登月并做其他事情” –我一直对其中的“其他事情”感到很开心) 实际上,最终没有进行质量检查测试。 我可以或多或少地处理#1。这个客户甚至不会在会议前阅读规范,更不用说撰写规范了。我习惯了。这是我遇到的问题的项目2:他们不测试或不会测试新版本。他们所做的是将其用于生产,因此,当出现错误时,他们要么找到解决方法而不报告,要么急着着手进行该项目,从而使错误报告模糊不清。 关于这一切,我们进行了很多讨论,但是我只能稍微推翻一下(例如,我们使用github进行问题跟踪-尽管我大多使用它)。根本原因有两个:它们是一家小型咨询公司,没有(或认为没有)测试资源(也没有预算将其外包)。和文化的:尽管他们认为自己是“开发人员”,但实际上他们只是多媒体软件包的用户。(例如,他们对“真实”开发人员的细节没有强迫症)。 如您所料,这会影响到我:没有反馈,我无法告诉您功能是否完整(请参阅#1),或者是否还有其他后果。这也让我有点懒。

3
我们如何跟踪每种环境中的代码版本?
我的团队目前使用相当简单的分支/部署过程,如下所示: ┌────────┐ ┌────┐ ┌──────┐ Environments: │ DEV │ │ QA │ │ PROD │ └────────┘ └────┘ └──────┘ ▲ ▲ ▲ │ │ │ ┌────────┐ ┌────┐ ┌──────┐ Builds: │ DEV │ │ QA │ │ PROD │ └────────┘ └────┘ └──────┘ ▲ ▲ ▲ │ │ │ ┌────────┐ ┌────┐ ┌──────┐ Branches: │ …

3
为什么要创建一个Logger对象,而不是在整个应用程序中使用静态日志记录方法?
以一个简单的Ruby on Rails应用程序为例。它Logger在应用程序加载过程中创建一个对象: # in environment.rb config.logger = Logger.new(<STDOUT | file | whatever>) # and in our application we use this object logger.warn "This process is taking too long to process. Optimization needed." 我的问题是,为什么我们不使用类方法(或静态方法)进行日志记录?会不会Logger.warn比Logger.new.warn?或至少Logger.warn看似直观Logger.new.warn。 即使Logger.new是单例对象,它提供什么好处?

5
代码审查落后于交付/测试周期
在我们的敏捷过程中,我们有2周的冲刺。每天(每天一次)交付任务,测试团队会在第二天甚至同一天立即完成测试。 我们也有开发人员代码审查,需要一些时间(1-2小时),因此每周安排3次:星期一至星期三至星期五。开发人员聚在一起,建议如何改进/重构代码。 我们的问题是,在代码审查后提出“行动项目”时,大多数任务已经过测试。测试人员不想重新测试已经通过测试的内容。他们不在乎内部开发人员的变更。 我们误解了敏捷过程吗?代码审查是否与每日发布/测试周期不兼容?我们无法每天进行代码审查,因为它们占用了每个人的时间。

1
相互实现两个Java 8默认方法是否是一种好习惯?
我正在设计一个具有两个相关方法的接口,类似于此方法: public interface ThingComputer { default Thing computeFirstThing() { return computeAllThings().get(0); } default List<Thing> computeAllThings() { return ImmutableList.of(computeFirstThing()); } } 大约一半的实现只会计算一件事,而另一半可能会计算更多。 这在广泛使用的Java 8代码中是否有先例?我知道Haskell在某些类型类中做类似的事情(Eq例如)。 好处是,与拥有两个抽象类(SingleThingComputer和MultipleThingComputer)相比,我必须编写更少的代码。 不利的一面是,一个空的实现可以编译,但是在运行时会用炸掉StackOverflowError。可以使用a来检测相互递归ThreadLocal并给出更好的错误,但这会增加非Buggy代码的开销。

2
新闻网站,例如《福布斯》 / Zdnet如何无缝地将一个网页合并到另一个网页中?
如果您去例如: http://www.forbes.com/sites/adrianbridgwater/2015/06/12/why-technology-has-to-be-continuous/ 或 http://www.zdnet.com/article/if-you-want-those-cool-ios-9-features-its-time-to-buy-a-new-ipad/ 当您到达页面底部时,将加载新新闻故事,并且Internet浏览器中的URL会更改为该下一新闻故事的URL。所以我想知道一个网页如何几乎可以立即加载下一个网页,而页面之间的延迟几乎可以忽略不计。例如,他们是否预先下载了“下一则新闻”故事的网页,然后真正快速地加载了网页?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.