软件工程

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

5
接口(OOP)的语义约定是否比功能签名(FP)更具信息意义?
有人说,如果您将SOLID原理付诸实践,那么您最终会从事函数式编程。我同意本文的观点,但是我认为从接口/对象到函数/闭包的转换会丢失一些语义,并且我想知道函数式编程如何减轻这种损失。 从文章: 此外,如果您严格地应用接口隔离原理(ISP),您将了解您应该比角色头接口更喜欢角色接口。 如果您继续将设计推向越来越小的界面,那么最终您将获得最终的角色界面:使用单一方法的界面。这在我身上经常发生。这是一个例子: public interface IMessageQuery { string Read(int id); } 如果我依赖IMessageQuery,则隐式合同的一部分是调用Read(id)将搜索并返回具有给定ID的消息。 将此与对其等效功能签名的依赖进行比较 int -> string。没有任何其他提示,此功能可能很简单ToString()。如果您使用A实施IMessageQuery.Read(int id),ToString()我可能会指责您故意颠覆性! 那么,函数式程序员可以做什么来保留命名接口的语义?例如,创建具有单个成员的记录类型是常规做法吗? type MessageQuery = { Read: int -> string }

4
有生产分支机构还是使用母版?
我与其他远程开发人员一起在Rails应用程序上与小型团队合作。我们开始修改我们的git工作流程。我们已经考虑过如下所示的分支结构: (dev) -> (qa) -> (stag) -> (master) 但是,一些开发人员认为,对于新开发人员而言,他们可能会自动将其推送到master上,这可能会减少混乱。他们反而想让每个人都在master上工作,并为生产创建一个单独的分支。 (master) -> (qa) -> (stag) -> (prod) 有人告诉我您要保持master的可部署性,而不是将其用作开发,并且从我曾经工作过的地方开始,master总是可以为生产而部署。 使用分支结构(其中主动使用master进行开发,而使用单独的prod分支进行部署)会带来哪些不利呢?
16 git 

2
高阶参数多态性有用吗?
我很确定每个人都熟悉以下形式的通用方法: T DoSomething<T>(T item) 此功能也称为参数多态(PP),特别是等级1 PP。 假设可以使用以下形式的函数对象来表示此方法: <T> : T -> T 即,<T>意味着需要一种类型的参数,以及T -> T装置,它需要类型的一个参数T并返回相同的类型的值。 那么以下将是2级PP函数: (<T> : T -> T) -> int 该函数本身不接受任何类型参数,但接受一个具有类型参数的函数。您可以迭代地继续进行此操作,使嵌套越来越深,PP等级越高。 在编程语言中,此功能确实很少见。默认情况下,甚至Haskell也不允许。 它有用吗?它可以描述很难用其他方式描述的行为吗? 此外,强制性意味着什么?(在这种情况下)

9
大O关于(n ^ 2 + n)/ 2增长率的算法的问题
我问这个问题是因为我对大O表示法的一个方面感到困惑。 我正在使用Frank Carrano的《Java的数据结构和抽象》一书。在“算法效率”一章中,他显示了以下算法: int sum = 0, i = 1, j = 1 for (i = 1 to n) { for (j = 1 to i) sum = sum + 1 } 他最初将这种算法描述为具有(n 2 + n) / 2的增长率。哪个看似直观。 但是,可以说,当n大时,(n 2 + n) / 2的行为类似于n 2。在同一段他说(N 2 + N) / 2也表现很像ñ …
16 algorithms  big-o 

4
具有多个参数的单个方法与必须按顺序调用的许多方法
我有一些原始数据,我需要做很多事情(移动它,旋转它,沿某个轴缩放它,将它旋转到一个最终位置),而且我不确定保持代码可读性的最佳方法是什么。一方面,我可以使用具有多个参数(10个以上)的单个方法来执行我需要的操作,但这是一场代码阅读的噩梦。另一方面,我可以使用1-3个参数制作多个方法,但是这些方法需要以非常特定的顺序调用才能获得正确的结果。我已经读过,最好的方法是做一件事情并且做好事,但是似乎有很多需要调用的方法才能打开代码以查找难以发现的错误。 我是否可以使用一种编程范例来使错误最小化并使代码更易于阅读?
16 java  readability 


3
Massive View Controller-IOS-解决方案
我确定每个新的iOS开发人员都会遇到以下问题:View Controller会很快因各种目的而挤满代码,很容易获得500多行代码。 这是两个基本和通用屏幕的外观: 1)表单屏幕: 2)表格视图控制器屏幕 到目前为止,我已经阅读了两种不同的解决方案: 第一个解决方案:https : //bendyworks.com/single-responsibility-principle-ios/。这是基于通知的,它将View Controller与(意图)View Model完全分开,从而减少了View Controller中的代码。我认为它具有破坏代码的缺点,类似于Go-To结构。看起来像这样: 第二种解决方案使拥挤的View Controller保持相同(按钮操作在VC中执行,依此类推)。但使用TPKeyboardAvoiding,BlocksKit之类的库或其他大多数基于类别的解决方案。使用第二种解决方案,可以大大减少代码,但是视图控制器仍然承担着很多责任。 您如何看待这些解决方案?哪个更好?有更好的吗?
16 mvc  ios  objective-c 

1
为什么Akka被推销为反应性产品?演员模型有反应性吗?
据我了解,Actor模型和反应式编程是独立的概念。演员模型似乎并不是天生对我有反应。 但是,作为参与者模型实现的Akka框架被描述为反应性的: “ Java和Scala程序逻辑存在于轻量级的Actor对象中,该对象以反应方式发送和接收消息。” “我们反应活跃” 是滥用术语还是完全正确?是否有任何参与者模型实现(例如Erlang)已经做出反应?仅仅生成消息作为对其他消息的响应也被认为是反应性的吗? 对比方法的一些相关阅读: StackOverflow:RX vs消息队列,例如Rabbitmq或zeromq? CS.SE:函数式反应性编程和Actor模型如何相互关联? Lambda Ultimate:演员与反应对象

10
为什么我们使用非描述性内部代号?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 我认为使用代号非常普遍。我们公司也在使用它们。 但我主要担心的是这些名称通常在任何地方都没有记录。意思是通过口耳相传。这些名称与它所命名的工具或实体的功能无关。 我看到了内部测试机以星座命名的模式,面向公众的服务器是以希腊众神命名的。项目以地名或一些随机选择的电影明星或人物的名字命名。但是,无论机器是Windows还是Linux,都无法直接从名称中获得任何信息。32或64位服务器。或项目是什么。 当我看到VCS的提交消息,即有人刚刚分支了“ Gandalf”项目或“ Callanish”项目或任何项目时,我只是感到不好过。出于同样的原因,您通常不会这样命名函数和变量。 我提议,至少对于新实体,我们应该使用更具描述性的名称,但是我面临着强烈的反对。显然,除我以外,组织中的每个人都喜欢这样命名。 那么为什么要使用非描述性的代号呢? 不要误会我的意思,我没有问题地命名程序版本和里程碑,也没有出于营销原因而使用好的产品名称。但在所有其他地方,我希望看到描述性名称。 编辑: 为您提供一些背景信息:Gandalf是移植代码64位的项目。Callanish是将其移植到Android的...我宁愿将前一个分支称为64bitporting,将后者称为androidporting。也许附有后缀,表示我们计划将其发布的目标版本。所以每个人都知道它的名字。 有问题的服务器是我们在其上测试产品的虚拟机映像。不过,我不知道它实际运行的物理机。因此,将它们称为windowsxp_32,windows7_64,debian_32或solaris_64完全可以。


5
当某些技术是“标准”时,这意味着什么?
我开始学习Java EE 7,经常遇到“标准”一词,但我不明白它的含义。 因此,例如,这是这本书的引文: 与依赖于W3C标准的SOAP和WS- *堆栈相反,REST没有标准,只是一种具有设计原则的体系结构样式。REST应用程序严重依赖于许多其他标准:HTTP,URI,URL ... 我对这可能意味着什么有所了解,但不确定。 我遇到的最好的解释是这里的定义。

7
如何提高C#,Java和类似语言中面向数学的代码的可读性?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 作为C程序员和C#程序员,我不喜欢C#的一件事就是数学函数的详细程度。例如,每次您必须使用正弦,余弦或幂函数时,都必须在Math静态类之前。当方程本身非常简单时,这将导致代码很长。如果您需要强制转换数据类型,则问题将变得更加严重。因此,我认为可读性受到影响。例如: double x = -Math.Cos(X) * Math.Sin(Z) + Math.Sin(X) * Math.Sin(Y) * Math.Cos(Z); 相对于简单 double x = -cos(X) * sin(Z) + sin(X) * sin(Y) * cos(Z); 在其他语言(如Java)中也是如此。 我不确定这个问题是否真的有解决方案,但是我想知道C#或Java程序员是否使用任何技巧来提高Math代码的可读性。但是我意识到C#/ Java / etc。不是像MATLAB之类的面向数学的语言,所以这很有意义。但是有时候,人们仍然需要编写数学代码,如果可以使其更具可读性,那就太好了。
16 java  c#  math  readability 

7
多个数据库调用与对Web API的网络调用真的很重要吗?
在我的一位雇主中,我们开发了REST(但也适用于SOAP)API。客户端即应用程序UI,将通过Web(在典型的生产部署中为LAN)对API进行调用。API将调用数据库。 在我们的讨论中反复出现的一个主题是性能:团队中的某些人认为,由于性能,您不应从单个API调用中进行多个数据库调用(通常是读取)。您应该对其进行优化,以便每个API调用仅(完全)一个数据库调用。 但这真的很重要吗?考虑到UI必须对API进行网络调用;相当大(毫秒级)。数据库经过优化,可以将内容保存在内存中并非常非常快地执行读取操作(例如,SQL Server可以将所有内容加载并保存在RAM中,如果可以的话,将消耗几乎所有的可用RAM)。 TLDR:当我们已经通过LAN进行网络调用时,担心多个数据库调用真的很重要吗?如果是这样,为什么? 明确地说,我说的是数量级-我知道这取决于具体情况(机器硬件,API和DB的选择等)。如果我有一个调用需要O(毫秒),那么是否会针对DB进行优化呼叫数量少一个数量级,实际上重要吗?还是这个问题比这还重要? 编辑:对于后代,我认为宣称在这种情况下我们需要通过组合数据库调用来提高性能是非常荒谬的,尤其是缺乏概要分析时。但是,是否执行此操作不是我的决定;我想知道认为这是优化Web API调用的正确方法的基本原理。

2
将清洁代码原则应用于功能语言
我目前正在阅读Robert Martin的Clean Code。我认为这很棒,在编写OO代码时,我会牢记他的课程。特别是,我认为他的建议是使用带有有意义名称的小函数,这使我的代码流程更加流畅。最好通过以下引用来总结: [W] e希望能够像读取一组TO段落一样阅读该程序,每个段落都描述了当前的抽象级别,并在下一层向下引用了后续的TO段落。 (清洁代码,第37页:“ TO段落”是一个以不定式表达的句子开头的段落。“要做X,我们执行步骤Y和Z。”“要做Y,我们...”等。 ) 例如: 对于RenderPageWithSetupsAndTeardowns,我们检查该页面是否为测试页面,如果是,则包括设置和拆卸。无论哪种情况,我们都以HTML呈现页面 我也为我的工作编写功能代码。马丁在书中的例子确实读起来好像是一段段落,而且非常清楚-但我不确定“读起来像一组段落”是否适合功能代码使用。 以Haskell标准库为例: maximumBy :: (a -> a -> Ordering) -> [a] -> a maximumBy _ [] = error "List.maximumBy: empty list" maximumBy cmp xs = foldl1 maxBy xs where maxBy x y = case cmp x y of GT -> …

1
为什么在C#中实现魔术方法?
在C#中,我开始看到所有这些魔术方法都弹出了,而没有界面的支持。为什么选择这个? 让我解释。 以前在C#中,如果对象实现了该IEnumerable接口,则该对象将自动被foreach循环迭代。这对我来说很有意义,因为它由一个接口备份,并且如果我要Iterator在要遍历的类中拥有自己的函数,则可以这样做,而不必担心它会神奇地意味着其他含义。 现在,显然,(不确定何时),不再需要这些接口。它只需要进行正确的命名转换即可。 另一个示例是通过使用一个确切 命名的方法来等待任何对象,该方法GetAwaiter具有一些特定的属性。 为什么不像以前那样创建一个界面IEnumerable或INotifyPropertyChanged静态地备份这种“魔术”呢? 关于我在这里的意思的更多细节: http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/ 魔术方法的优缺点是什么,在网上哪里可以找到有关为什么做出这些决定的任何信息?
16 c# 

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.