软件工程

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

5
确保跨平台兼容性(C ++)的技术?
我正在完成我最早的C ++项目之一(根据框架),该项目应该是跨平台的。我完全在Windows和Visual Studio中开发了该项目,以为既然这些库都是跨平台的,那么“以后”进行OSX构建将是微不足道的。事实并非如此,而是“ Windows代码”无法正常运行,并且需要解决一些编译错误。 预先存在哪些技术可以确保代码与所有平台兼容?同时开发所有平台,从而在添加新功能时针对每个平台同时测试代码,而不是一个接一个地开发不同的平台版本?(*) 从外观上来看,特别建议不要依赖于工具,而可以使用“开发过程”来帮助跨平台兼容性,无论使用什么工具。就像上面的一个(*)。 具体来说,我正在使用WDL-OL(https://github.com/olilarkin/wdl-ol)和一些跨平台DSP库开发VST插件。WDL-OL项目同时设置了VS和Xcode项目,但我想问题出在库中,然后是编译器之间的差异。

4
C结构的行为可以像具有功能一样吗?
我struct在结构可以有成员但没有函数的地方使用C和s。为简单起见,假设我要为我命名的字符串创建一个结构,str并且我希望能够在str.replace(int i, char c)哪里完成i该操作,该操作是字符串的索引,也是c替换位置上的字符的字符i。因为结构体没有功能,或者我们仍然可以通过某种方式实现这种行为并模仿结构体可以具有(简单)功能的事实,这实际上仅仅是结构体将自身复制到新结构体并更新其结构体,所以这将永远不可能吗?字段,它可以做什么? 因此,replace可能是该结构的第三个成员,该成员指向一个新的结构,该新结构在访问或类似的操作时会更新。能做到吗?还是有些内在的东西或某种理论或范例阻止了我的意图? 背景是我正在编写C代码,并且发现自己正在重新发明一些我所知道的函数,这些函数是OOP语言中的内置库,而OOP将是一种处理字符串和命令的好方法。

5
根据得墨'耳(Demeter)的法律,是否允许某类返回其成员之一?
关于德米特定律,我有三个问题。 除了专门指定用于返回对象的类(例如工厂类和构建器类)之外,还可以使用一种方法来返回对象,例如,由该类的一个属性持有的对象,或者会违反demeter(1)的定律。?并且,如果它违反了demeter的定律,那么返回的对象是否是一个不可变的对象(表示一个数据,并且除了该数据的吸气剂之外就什么也不包含)(2a),这会很重要吗?还是这样的ValueObject本身就是反模式,因为使用该类中的数据完成的所有操作都是在类(2b)之外完成的? 用伪代码: class A {} class B { private A a; public A getA() { return this.a; } } class C { private B b; private X x; public void main() { // Is it okay for B.getA to exist? A a = this.b.getA(); a.doSomething(); x.doSomethingElse(a); } } 我怀疑得墨meter耳的定律禁止这种模式。我该怎么做才能确保doSomethingElse()在不违反法律的情况下可以被调用(3)?

2
如何测试不可注入的代码?
因此,我在系统中使用了以下代码。目前,我们正在回顾性地编写单元测试(比我的观点迟来的要好得多),但是我不知道这将是可测试的吗? public function validate($value, Constraint $constraint) { $searchEntity = EmailAlertToSearchAdapter::adapt($value); $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords()); $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity); $query = $adapter->setupBuilder()->build(); $totalCount = $this->advertType->count($query); if ($totalCount >= self::MAXIMUM_MATCHING_ADS) { $this->context->addViolation( $constraint->message ); } } 从概念上讲,这应该适用于任何语言,但是我正在使用PHP。该代码只是基于一个对象构建了一个ElasticSearch查询对象,而该Search对象又是从一个EmailAlert对象构建的。这些Search和EmailAlert只是POPO。 我的问题是,我不知道怎样才能模拟出的SearcherFactory(使用静态方法),也不是SearchEntityToQueryAdapter,它需要从结果SearcherFactory::getSearchDirector 和的Search实例。如何在方法中注入从结果中构建的内容?也许有一些我不知道的设计模式? 谢谢你的帮助!

5
如何使Scrum在具有定义角色的团队中工作?
一些背景资料 我是内部软件开发团队的一员。它包括 5位开发人员(经验从2到5年不等,我是其中之一) 3名实施人员(他们进行软件部署和培训) 和一名项目经理。 我们开发了大量的中小型项目,它们的时间表通常重叠。开发过程如下: “客户”给我们提出了一系列初步要求 我们按照上述规范开发系统 向“客户”展示所述系统 “客户”根据上述介绍向我们提出了其他要求 重复2-4,直到“客户”用完新要求或部署目标日期临近 设置和部署系统 这与事实是,大多数情况下都是由“客户”来处理最后期限(这是一个危险信号,根据我在Programmers和PM.SE中的了解),我们没有遵循明确的开发方法牛仔编码,几乎不可维护的代码以及通过生产而产生的错误等。这就是为什么我们选择采用像Scrum这样基于敏捷的方法。 为什么是Scrum? 这是我们经理的倡议,鉴于我们目前的情况,每个人似乎都对此表示同意。 Scrum的问题 Scrum的某些元素与我们目前无法轻松解决的设置存在冲突,特别是敏捷开发人员的“万事通”性质。部署团队不知道如何编程,开发人员的沟通和培训技能低于平均水平。而且这个阵容不会很快改变。 问题 它会影响Scrum作为一种方法的有效性吗?是否需要进行其他更改以补偿?还是完全放弃这种想法而考虑另一种方法会更好吗?

3
提供CDN后备的本地JS和CSS资源
鉴于 CDN是一件好事,因为它们可以为靠近客户端的资源提供服务,客户端可以缓存它们,并且您可以减少自己服务器上的负载。 在最新的浏览器中,由于子资源完整性(SRI)的原因,从第三方服务器加载资源不会降低安全性。 CDN在某些国家/地区可能已关闭或受阻,并且在离线开发1时不可用。 我认为使用CDN很有必要,但也要为它们不可用做准备。这篇博客文章很好地介绍了提供备用功能的不同方法。如果看一下Basic示例,您会发现它已经包含了很多样板代码,仅可为jQuery和Bootstrap提供后备,而受青睐的解决方案建议使用Fallback.js,在过去的一年中似乎几乎没有保留。 。同样,与该主题最相关的SO问题仅涉及为jQuery提供后备功能。 但是,在大多数实际项目中,我希望有5个或更多的js / css资源,所以我觉得您不必重复一些混乱的样板即可为所有这些提供后备。此外,每次添加或更新资源时,您现在都必须 更新CDN链接 通过手动下载或更改npm / bower配置中的版本来更新本地后备副本 更新链接到后备 更新SRI哈希 而在理想世界中,我希望在一个配置文件中添加/更新资源,并让所有其他步骤自动执行(然后运行测试以查看更新是否破坏了任何内容)。 是否已经建立工作流程来实现这一目标? 还是CDN尤其是SRI太新了? 还是大多数人根本不愿意为CDN资源提供后备资源? 1.尽管您可以拥有一个不依赖CDN的开发版本,但是我也认为这是一种后备形式,因为它也需要维护。
13 javascript  css  cdn 

2
使用/导入语句过多是否表示不良设计或代码异味?
通常,我在类文件的顶部看到一些using语句。例: using System.Collections.Generic; using System.IO; using System.Xml.Linq; 但是在我正在从事的一个项目中,有几次在一个类文件中看到20个或更多的uses / imports。这是不好的设计吗?看来,旨在做一件事的类应该仅依赖于几个组件。

4
如果我的IDE非常聪明,为什么我需要强制转换“ clone()”?
我在输入代码时,我的IDE(NetBeans)类型检查我Collections。但是,为什么我必须转换返回的对象Object.clone()?没关系 无害无犯规。但是我还是不明白。 是否在没有强制转换的情况下进行类型检查,Object.clone()否则无法返回的对象?该仿制药框架让我觉得IDE可以检查类型的“的右侧的对象引用= ”标记而无需进行转换,而我打字?我不明白 附录 我的用例只是我有一个私有Calendar字段pubdate。我打算写: Calendar getPubdate() { return pubdate; } 但是存在调用者可以修改我的pubdate的风险,因此我返回了一个副本: Calendar getPubdate() { return (Calendar) pubdate.clone(); } 然后,我想知道为什么我需要铸造pubdate.clone()。方法签名在那里具有类型。NetBeans应该能够弄清楚这一点。和NetBeans的似乎在做关于类似的东西Collections。

3
何时给定(GWT)和行为安排断言(AAA)之间的区别?
在TDD中,有Arrange Act Assert(AAA)语法: [Test] public void Test_ReturnItemForRefund_ReturnsStockOfBlackSweatersAsTwo_WhenOneInStockAndOneIsReturned() { //Arrange ShopStock shopStock = new ShopStock(); Item blackSweater = new Item("ID: 25"); shopStock.AddStock(blackSweater); int expectedResult = 2; Item blackSweaterToReturn = new Item("ID: 25"); //Act shopStock.ReturnItemForRefund(blackSweaterToReturn); int actualResult = shopStock.GetStock("ID: 25"); //Assert Assert.AreEqual(expectedResult, actualResult); } 在BDD中,编写测试使用类似的结构,但语法为“当下(GWT)”: [Given(@"a customer previously bought a black sweater …
13 c#  unit-testing  tdd  bdd 

1
对象生存期不变性与移动语义
很久以前,当我学习C ++时,我就强烈强调C ++的部分意思是就像循环具有“循环不变式”一样,类也具有与对象生命周期相关的不变式-应该是正确的只要物体还活着 应该由构造函数建立并由方法保留的事物。封装/访问控制可帮助您强制执行不变式。RAII是您可以使用此想法做的一件事。 从C ++ 11开始,我们现在有了移动语义。对于支持移动的类,从某个对象移动不会正式终止其生命周期,因为该移动应该使它处于某种“有效”状态。 在设计一个类时,如果将其设计为仅保留该类的不变性直到将其移出之前,是不好的做法吗?或者是说没关系,如果它可以让你让它走得更快。 具体来说,假设我有一个不可复制但可移动的资源类型,如下所示: class opaque { opaque(const opaque &) = delete; public: opaque(opaque &&); ... void mysterious(); void mysterious(int); void mysterious(std::vector<std::string>); }; 无论出于何种原因,我都需要为此对象创建一个可复制的包装,以便可以在某些现有的调度系统中使用它。 class copyable_opaque { std::shared_ptr<opaque> o_; copyable_opaque() = delete; public: explicit copyable_opaque(opaque _o) : o_(std::make_shared<opaque>(std::move(_o))) {} void operator()() { o_->mysterious(); } void …

4
在c中打包结构是否有标准方法或标准替代方法?
当使用CI编程时,发现使用GCCs __attribute__((__packed__))属性打包结构非常有价值,因此我可以轻松地将易失性存储器的结构化块转换为字节数组,以通过总线传输,保存到存储或应用于寄存器块。打包的结构保证了当被当作字节数组对待时,它不会包含任何填充,这既浪费,可能的安全风险,又与接口硬件连接时不兼容。 没有适用于所有C编译器的打包结构的标准吗?如果不是,那么我认为这是系统编程的关键功能是一个异常现象吗?早期使用C语言的用户是否没有发现打包结构的需要,或者是否有其他选择?

1
是否有标准化的做法来对HTML标签中的属性进行排序?
我正在AngularJS项目上工作,并且我的许多HTML元素中的属性很多: <button type="submit" ng-click="Page.UI.DetailView.ExecuteFunction()" ng-disabled="step5.$invalid" class="btn btn-success pull-right"> Submit this Product </button> 这些属性的顺序是否存在标准化约定?按字母顺序?按含义分组(例如,所有角度属性一起)?首先是标准HTML属性(例如“类型”)?

2
当正在进行的提交突然看起来依赖于另一个尚未提交的提交时,该如何处理呢?
我对Git经验不足,但是我会尽力去适应它,到目前为止,我只是将它用于我自己从事的项目。 当我编写代码时,自然会有一些自上而下的方法(因为我不知道未来),并且有一个重复出现的主题: 我做一些工作。 我发现要使我的工作变得“值得承担”,我需要做其他工作。 其他工作值得自己承担。 所谓可承诺的东西,是指可以编译的东西,或者不是完全混乱的东西。 通过某种值得它自己提交的东西,我指的是我了解到提交应该只做一件事。 我解决它的方法很麻烦。如果其他工作在另一个文件中,则我创建一个新分支,在那里提交并合并。如果工作在同一文件中.. ugh ..我进行本地复制并将文件重置为HEAD中的状态,进行所需的提交,然后开始从该副本恢复我的工作。我实际上应该如何处理?我没有想到这是这样吗?我不这么认为,因为它一定会经常出现在每个人身上(至少他们也不知道未来)。还是似乎我的工作流程可能有缺陷?
13 git 

5
破旧/旧版单元测试
我在一家大公司工作,负责一个带有数千个junit测试的大型Java应用程序。自从我担任这个职位以来,已经有200到300个失败的测试(可能是多年失败的测试)。这些测试既旧又脆弱,并且杂乱无章,通常以实时沙盒数据结尾。 我的目标是100%通过测试,这样我们就可以打破单元测试失败的基础,但是直到解决了失败的测试之后我才能做到。我的预算很少,因为维护预算主要用于支持,但是我的团队已经确定并修复了低挂的水果测试(主要是配置/本地资源问题),而我们的测试只有30-40个非常丑陋。 对最佳实践有何看法?我认为测试不是有价值的,但是我也不知道他们正在测试什么,或者为什么他们不钻研就无法工作,这需要我们花费很多时间和金钱。 我想我们应该用我们知道的任何东西记录破损测试的状态,然后完全删除或忽略破损测试,并输入一个较低优先级的错误/工作项来调查和修复它们。然后,我们将达到100%的水平,并开始从其他测试中获得真正的价值,如果我们有维护/重构的意外之财,我们将能够再次进行选择。 最好的方法是什么? 编辑:我认为这是一个不同于该问题的问题,因为我对我们应该编写的测试有明确的方向,但是我继承了遗留失败的测试,以便在当前的大量测试变得有意义之前解决这些问题。

1
数据库中的领域模型可以成为可持续的解决方案吗?
我刚开始担任新职位,是一家基于Microsoft技术的中小型公司的数据库开发人员。我很早就注意到关于最佳实践,设计模式,测试和项目管理的实践与我在学校所教的有多少不同。 最让我烦恼的是我们的主要数据库开发人员(以下称“约翰”)如何将模型架构保留在数据库中!为此,我们有3个“魔术”表;一种用于数据库方案,一种用于表,一种用于列。 将记录插入“ 表 ”表中(通过数据库触发器)会生成实际的对应表。在“ 行 ”表中插入一行会用该行更新引用的表。反过来,他的自制C#程序会读取这些代码以生成C#模型,前端开发人员将其用于控制​​器和外部。 除此之外,大多数开发都是根据ASP.NET MVC框架完成的。 我发现这种方法存在一些缺陷: 我们需要他维护ORM,而他很少有时间这样做(工作安全性很好!) “表”和“行”表的触发器存在缺陷。它们不支持表更新,也不支持检查约束或更多“高级”功能。虽然我们可以肯定地改进它们,但我不确定这是否可行。 将程序逻辑保存在数据库中感觉很奇怪且很严格(尽管可以通过C#扩展他的模型)。 他的C#模型生成器必须由3个人之一(我是其中之一)手动运行,并且还不成熟,无法包含在自动化构建过程中。 一些人建议逐步使用像Entity Framework这样的经过测试的真实产品,但他不予理,,并声称将业务逻辑保留在代码层中仅适用于小型应用程序和启动项目。 这篇文章导致了一些看起来像是经过深思熟虑的讨论,但这并不是我的意图。我只想对我们的体系结构方法进行一些说明。 将域模型保留在数据库中是否可以成为成长中的公司的可持续解决方案?

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.