软件工程

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

6
基于合同的编程与单元测试
我是一个有点防御性的程序员,并且是Microsoft代码合同的忠实拥护者。 现在我不能总是使用C#,在大多数语言中,我唯一拥有的工具就是断言。所以我通常会得到这样的代码: class { function() { checkInvariants(); assert(/* requirement */); try { /* implementation */ } catch(...) { assert(/* exceptional ensures */); } finally { assert(/* ensures */); checkInvariants(); } } void checkInvariants() { assert(/* invariant */); } } 但是,这种范式(或您所说的任何范式)会导致很多代码混乱。 我开始怀疑这是否值得付出努力,是否已经进行了适当的单元测试?

4
哪种方法可以终止阅读循环?
当您需要遍历读取器的地方时,要读取的项目数是未知的,唯一的方法是保持读取直到结束。 这通常是您需要无限循环的地方。 还有就是始终true表示必须有一个break或return声明的某处块内。 int offset = 0; while(true) { Record r = Read(offset); if(r == null) { break; } // do work offset++; } 有双读for循环方法。 Record r = Read(0); for(int offset = 0; r != null; offset++) { r = Read(offset); if(r != null) { // do work } } …

2
使用C#接口实现Haskell类型类
我正在尝试比较Haskell的类型类和C#的接口。假设有一个Functor。 Haskell: class Functor f where fmap :: (a -> b) -> f a -> f b 如何在C#中将此类型类实现为接口? 我尝试过的 interface Functor<A, B> { F<B> fmap(Func<A, B> f, F<A> x); } 这是无效的实现,实际上我受困于F应该由返回的泛型类型fmap。应该如何定义它以及在哪里? Functor用C#不可能实现吗?为什么?也许还有另一种方法?
13 c#  haskell 


6
如何练习面向对象的编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我一直使用过程语言进行编程,目前正朝着面向对象的方向发展。我面临的主要问题是我看不到一种有效地练习面向对象的方法。我会解释我的观点。当我学习PHP和C时,它很容易实现:只是选择一些东西并考虑该东西的算法。 例如,在PHP中,坐下来思考是一件很重要的事情:“好吧,为了练习,让我在一个可以添加产品的管理区域构建一个应用程序”。这非常简单,只需考虑一种算法即可注册一些用户,登录该用户并添加产品。结合使用这些功能和PHP功能,这是练习的好方法。 现在,在面向对象方面,我们还有很多其他东西。这不仅仅是考虑算法的问题,还包括更深入地分析需求,编写用例,弄清楚类图,属性和方法,设置依赖注入以及许多其他事情。 要点是,在我学习面向对象的方式中,一个好的设计似乎至关重要,而在过程语言中,一个模糊的想法就足够了。我并不是说在过程语言中我们可以不用设计就可以编写好的软件,只是为了实践而可行,而在面向对象的情况下,即使没有实践也要经过良好的设计似乎是不可行的。 这似乎是一个问题,因为如果每次我要练习时,我都需要弄清大量的需求,用例等,这似乎并不是提高对象定向的好方法,因为这需要每次练习时,我对应用程序都有一个完整的想法。 因此,练习面向对象的好方法是什么?

6
哪些功能特性值得为它们带来的好处感到困惑?
在使用Haskell和F#学习了函数式编程之后,OOP范例似乎在类,接口和对象方面倒退了。我的同事可以理解FP的哪些方面?是否有任何FP风格值得与我的老板谈谈对我的团队进行再培训,以便我们可以使用它们? FP的可能方面: 不变性 部分应用和咖喱 一流的功能(功能指针/功能对象/策略模式) 惰性评估(和Monad) 纯功能(无副作用) 表达式(相对于语句-每行代码都会产生一个值,而不是引起副作用,或者除了引起副作用之外) 递归 模式匹配 它是一种免费的所有人,我们可以在编程语言支持的范围内做任何事情吗?还是有更好的指南?


4
linq是否比表面上的效率更高?
如果我写这样的话: var things = mythings .Where(x => x.IsSomeValue) .Where(y => y.IsSomeOtherValue) 是否与以下内容相同: var results1 = new List<Thing>(); foreach(var t in mythings) if(t.IsSomeValue) results1.Add(t); var results2 = new List<Thing>(); foreach(var t in results1) if(t.IsSomeOtherValue) results2.Add(t); 还是在幕后有一些更像这样的魔术: var results = new List<Thing>(); foreach(var t in mythings) if(t.IsSomeValue && t.IsSomeOtherValue) results.Add(t); 还是完全不同?
13 c#  linq 

3
非IT经理应如何确保必需的旧版软件的长期维护和开发?
我们是一家规模很小,非常专业的福利管理公司,拥有非常有用,功能强大的软件集合,其中一些是用COBOL编写的,但大多数是用BASIC编写的。在过去的30多年中,有两名全职顾问稳定地维护和改进了该系统。不用说他们即将退休。(他们中的一个人已经迫切退休了,但是忠于错误,所以尽管丈夫坚持高尔夫应该优先考虑,但他们仍然坚持下去。) 我们开始了向该系统的转换,该系统由该国仅有的三家提供我们所用软件类型的公司之一开发。我们现在认为,尽管该公司理论上有能力完成转换过程,但是他们没有及时完成转换的资源,并且我们已经开始相信他们将无法提供我们需要的那种服务我们的业务。(没有什么能够设定自己的优先级并有权按自己认为合适的方式分配资源的。) 硬件不是问题-我们能够在现代服务器上非常有效地进行仿真。如果COBOL和BASIC是现代语言,我们愿意冒着风险,可以为未来的现有顾问找到替代品。 一家IT支持公司似乎应该有一种业务模型,该公司应专注于这样的旧平台,并提供编程和软件开发人才来支持像我们这样的系统,从而避免了寻找合适的编程人才的风险。说服年轻的程序员,他们可以有一个富有成果的,有回报的职业,这项工作的一部分是使用一种古老的,非性感的语言(例如BASIC)。 简而言之,作为非IT经理,我们如何最好地管理这一过渡?
13 legacy 

3
我们是否正确排队和序列化?
我们通过各种服务处理消息(一条消息在完成之前可能会涉及9个服务,每个服务都具有与IO相关的特定功能)。现在,我们结合了最坏情况(XML数据协定序列化)和最佳情况(内存中的MSMQ)的性能。 消息的性质意味着我们的序列化数据最终约为12-15 KB,并且我们每周处理约400万条消息。MSMQ中的持久消息对我们来说太慢了,随着数据的增长,我们感受到了MSMQ的内存映射文件带来的压力。 该服务器的内存使用量为16GB,并且正在增长,仅用于排队。 当内存使用率很高时,由于机器开始交换,因此性能也会受到影响。我们已经在执行MSMQ自清除行为。 我觉得这里有些地方我们做错了。我尝试使用RavenDB保留消息并仅对标识符进行排队,但性能却非常慢(每分钟最多1000条消息)。我不确定这是使用开发版本还是使用什么版本,但我们确实需要更高的吞吐量[1]。该概念在理论上非常有效,但性能不能满足要求。 使用模式具有一项充当路由器的服务,该服务会进行所有读取。其他服务将基于它们的第3方挂钩附加信息,然后转发回路由器。大多数物体被触摸9至12次,尽管大约10%的物体在该系统中被迫循环一会儿,直到第三方做出适当响应为止。现在,由于这一原因,我们利用消息的优先级字段来解决此问题并具有适当的休眠行为。 因此,我的问题是,在C#/ Windows环境中用于在离散但LAN的计算机之间传递消息的理想堆栈是什么? 我通常从BinaryFormatter而不是XML序列化开始,但是如果更好的方法是将序列化卸载到文档存储中,那就太麻烦了。因此,我的问题。 [1]:我们的业务性质意味着我们越早处理消息,我们就越赚钱。我们已经通过经验证明,在本周晚些时候处理一条消息意味着我们赚钱的可能性较小。虽然“每分钟1000个”的性能听起来非常快,但我们确实需要将该数字提高到1万个/分钟。仅仅因为我每周在消息中提供数字并不意味着我们有整整一周的时间来处理这些消息。 ===============编辑: 附加信息 根据评论,我将添加一些说明: 我不确定序列化是我们的瓶颈。我已经对应用程序进行了基准测试,虽然序列化确实显示在热图上,但它仅占服务CPU利用率的2.5-3%。 我最担心的是我们消息的持久性和对MSMQ的潜在滥用。我们使用的是非事务性,非持久性消息,因此我们可以保持排队性能,而且我真的很希望至少有持久性消息,以便它们在重新启动后仍能生存。 添加更多的RAM是权宜之计。机器的内存已经从4GB减少到了16GB,并且越来越难以取舍以继续增加容量。 由于应用程序的星形路由模式,对象弹出一半时间然后被推到队列中,它根本不会改变。这又使(IMO)能够将其存储在其他地方的某种键值存储中,并仅传递消息标识符。 星型路由模式是应用程序不可或缺的,并且不会更改。我们无法以应用程序为中心,因为此过程中的每一部分都异步运行(以轮询方式),并且我们希望将重试行为集中在一个地方。 应用程序逻辑是用C#编写的,对象是不可变的POCO,目标部署环境是Windows Server 2012,如果仅在Linux中支持特定软件,则允许我们站立其他计算机。 我的目标是保持当前吞吐量,同时以最小的资本支出减少内存占用并提高容错能力。

4
Rails:德米特混乱法则
我正在阅读一本名为《 Rails反模式》的书,他们谈论使用委派来避免违反Demeter法则。这是他们的主要例子: 他们认为在控制器中调用这样的命令是不好的(我同意) @street = @invoice.customer.address.street 他们提出的解决方案是执行以下操作: class Customer has_one :address belongs_to :invoice def street address.street end end class Invoice has_one :customer def customer_street customer.street end end @street = @invoice.customer_street 他们说,由于您仅使用一个点,因此您没有违反Demeter定律。我认为这是不正确的,因为您仍在通过客户通过地址来获取发票的街道。我主要是从我读过的博客文章中得到这个想法的: http://www.dan-manges.com/blog/37 在博客文章中,主要的例子是 class Wallet attr_accessor :cash end class Customer has_one :wallet # attribute delegation def cash @wallet.cash end end …

5
可以在没有状态的情况下表示任何程序任务吗?
这是一个理论问题,但是经过多年的编程之后,我意识到现在是“正常的”命令式技术,主要使用C ++,我发现了函数式编程的另一个领域,在偶然学习JavaScript时偶然发现了这个问题。 这使我想知道您是否可以用一个纯粹的功能且没有状态的不同实现在技术上替换任何完整的面向状态的程序? 这是一个有趣的想法,我必须承认,函数编程的清晰性和优雅性确实让我大吃一惊。

6
将元数据信息存储在文件名中是不好的做法吗?更好的解决方案?
我注意到我在哪里工作,人们热衷于在文件名中存储信息并解析文件名。 对我来说,这似乎不是特别好的做法。我已经看到脚本偶尔会遍历一个文件的问题,并且由于另一个文件首先匹配而出现错误,我们也正在讨论如何解决字段分隔符的问题。 是否被认为是不良做法? 基于某种类型的元数据从文件系统中检索文件的其他公认解决方案是什么?

2
RESTful API是否应该提供整个表单的数据?
假设我有一个JavaScript Web应用程序,它完全使用RESTful API来处理数据。 假设此应用程序具有数据表单,并且假设我正在/ product / 12345上编辑一条记录。构建表单时,我向/ product / 12345发出RESTful请求并获取JSON数据: { "id": 12345, "name": "Some Product", "active": true, "sales_user_id": 27 } 因此,我的表单显然可以具有用于选择销售人员的下拉列表。我需要填充此列表。 数据应该从哪里来?最常见的方法是什么? 使其成为/ product / 12345请求响应的一部分有意义吗? { "id": 12345, "name": "Some Product", "active": true, "sales_user_id": 27, "sales_users": [ {"id": 1, "name": "Anna Graham"}, {"id": 2, "name": "Dick Mussell"}, {"id": …
13 api  rest  forms 

2
如何在您的Web主机上进行“ git push”更新文件?
我有一些网站都在共享托管下托管在同一网络托管服务上。我的网络主机支持Git,并且可以通过SSH进行访问,并且我的笔记本电脑上也具有Git设置。 我想这样做,以便当我执行“ git push origin master”时,它将自动更新Web服务器上的文件,并且还保存以前提交的文件的备份,以便我可以轻松回滚。这可能吗?
13 git  web 

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.