软件工程

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

4
两个具有相同签名的接口
我正在尝试为纸牌游戏建模,其中纸牌具有两项重要功能: 首先是效果。这些是您玩纸牌时对游戏状态所做的更改。效果界面如下: boolean isPlayable(Player p, GameState gs); void play(Player p, GameState gs); 而且,当且仅当您能够支付费用且其所有效果均是可玩的时,您才可以考虑使用该卡。像这样: // in Card class boolean isPlayable(Player p, GameState gs) { if(p.resource < this.cost) return false; for(Effect e : this.effects) { if(!e.isPlayable(p,gs)) return false; } return true; } 好的,到目前为止,非常简单。 卡上的另一组功能是异能。这些功能是对游戏状态的更改,您可以随意激活它们。当提出这些接口时,我意识到他们需要一种确定是否可以将其激活的方法,以及一种用于实现激活的方法。最终被 boolean isActivatable(Player p, GameState gs); void activate(Player p, …
13 interfaces 

2
是否有通常用于创建大型功能编程应用程序的特定工作流程或设计模式?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我已经探索Clojure已有一段时间了,尽管我没有在任何重要的项目中使用过它。基本上,我对语法和某些惯用法已经很熟悉了。来自OOP的背景,Clojure是我非常关注的第一种功能语言,我自然对功能处理方式不太满意。 也就是说,创建大型功能应用程序时是否存在特定的工作流程或设计模式?我真的很想开始“真正地”使用函数式编程,但是由于我目前的专业知识不足,恐怕会导致史诗般的失败。 “四人帮”是面向OO程序员的标准,但是是否有类似的东西更针对功能范例呢?我发现的大多数资源都具有出色的编程能力,但它们并没有退缩以提供更广泛,更体系结构的外观。

4
配对编程的原因
我曾在几家商店工作过,在这些商店中,管理层已经将结对编程的想法传授给我或另一位经理/开发人员,而我对此一无所知。从开发人员的角度来看,我找不到改用这种编码样式会有所裨益的原因,或者作为一个小型团队的经理,我都看不出任何好处。 我了解它有助于解决基本的语法错误,并且在需要散列某些内容时可能会有所帮助,但是不在编程循环中的经理们似乎一直将其视为阻止设计师进入Facebook或Reddit的一种方式,而不是设计工具。 作为一个接近开发层的人,从高级管理职位看来,我似乎根本无法理解被扔给我的书或有关该主题的Wiki页面,因此,结对编程在处理Scrum或Agile时有什么好处?环境?

6
将未完成的项目的代码放在github上的优点和缺点是什么
我要说明的一个项目是我打算通过githubs作为开源发布的项目。从一开始就将代码放在github上有什么好处,而不是等到项目处于工作状态才发布。 如果重要的话,这个特定的项目是一个C#应用程序/服务,并且我只有一个免费的github帐户(因此我无法将其设为私有,然后稍后再撤回封面)

8
是否甚至需要编码标准?
我知道已经证明编码标准可以提供极大的帮助。但是,有许多不同的工具和IDE可以格式化为程序员喜欢的任何标准。只要代码整洁/评论(而不是意大利面条混乱),我就看不到需要编码标准。 是否有关于开发编码标准的争论(我们没有一个,但我一直在考虑创建一个)?

3
我们可以使用Ruby创建桌面应用程序吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 6年前关闭。 我知道Ruby on Rails框架仅适用于Web开发,不适用于桌面应用程序开发。但是,如果红宝石程序员想要开发桌面应用程序,那么仅使用Ruby(不是jRuby,因为大多数教程都是针对jRuby的),是否合适并且更可取?如果是,请提供一些好的教程。我想使用linux作为开发的操作系统。 请提出一些建议,因为我是红宝石开发人员,想开发桌面应用程序。

4
接口是否应该扩展其他接口(并以此继承方法)
尽管这是一个普遍的问题,但它也特定于我当前遇到的问题。我目前在解决方案中指定了一个接口,称为 public interface IContextProvider { IDataContext { get; set; } IAreaContext { get; set; } } 该接口经常在整个程序中使用,因此我可以轻松访问所需的对象。但是,在程序一部分的较低级别,我需要访问另一个将使用IAreaContext并对其执行一些操作的类。因此,我创建了另一个工厂接口来执行此创建操作: public interface IEventContextFactory { IEventContext CreateEventContext(int eventId); } 我有一个实现IContextProvider的类,并使用NinJect注入。我遇到的问题是,我需要使用此IEventContextFactory的区域只能访问IContextProvider,并且本身使用另一个需要该新接口的类。我不想在低级实例化IEventContextFactory的此实现,而是希望始终使用IEventContextFactory接口。但是我也不想只通过构造函数注入另一个参数,而只是将其传递给需要它的类,即 // example of problem public class MyClass { public MyClass(IContextProvider context, IEventContextFactory event) { _context = context; _event = event; } public void DoSomething() …
13 c#  design  interfaces 

5
术语“纯OO语言”的正式定义?
我想不出SO兄弟姐妹之间有更好的位置提出这样的问题。最初,我想问“ python是纯OO语言吗?” 但是在尝试定义术语时,考虑到麻烦和人们的不适感,我决定从为术语本身获得明确的定义开始。 从创造该术语的Alan Kay博士的来信开始,这是相当公平的(请注意在生物学上类似于细胞或其他生物的灵感)。 有以下几种方法可以完成任务: 通过列出可以表现出(或不能表现出)某些独特且足以定义该术语的属性的编程语言来进行比较分析(尽管Smalltalk,Scala,Java等)是可能的示例,但IMO这种方式似乎并没有真正完成也不富有成果) 给出一个正式的定义(或接近它,例如以学术或数学的风格)。 给出一个完全依赖于具体语言的语义上下文或先验编程经验的哲学定义(社区一定有一定的成功解释的机会)。 我当前的版本:“如果某种编程(形式化)语言可以(在语法上)区分操作数和操作数,并推断每个操作数的类型是否是对象(就OOP而言),那么我们称之为只要该语言中至少有一种类型是对象,那么这种语言就是一种面向对象的语言。最后,如果所有类型的语言都是对象,我们将这种语言定义为纯(强)面向对象的语言。” 将不胜感激。如您所见,我只是根据术语“对象”(通常完全称为对象类)来进行定义。 [编辑] 另外,我使用(很容易理解的)类型概念,就像在类型化语言中一样。数据类型编程或面向类型的编程不仅是对程序文本的语法解释(即,如何处理文字和数据变量的某些值-演变为类型安全性的某种东西),而且可以归因于语言语法并以正式方式进行研究(使用数学逻辑)称为类型系统。注意,要求特定类型系统具有所谓的通用类型是定义OO语言纯净性的方法之一(有一些方法可以在语义上进行扩展)。 NB 如何回答: 如果您指定支持或解释您对术语和概念的理解的书或参考文献(通常是一个好的定义涵盖或参考了除基础知识以外的所有相关概念),它会有所帮助。 如果不清楚,请在可能的情况下注明答案/定义的缩进类别(请参见上文:1-以语言为例,2-数学逻辑,3-技术描述和编程原理) 分类很重要(也是因为术语OO包含在术语OO中),同时回答尝试将OO范式的元素与其他众所周知的方法进行混合(并且绝不会造成混淆/重叠),例如,通常可以覆盖模块化编程的元素/包含OO编程):尝试将OOP与功能编程,逻辑编程(尤其是高度专业化的),Abstarct数据类型(ADT),模块化,元编程(泛型和LISP的宏扩展时间)(包括或作为其一部分)进行区分,合同(例如Eiffel),面向方面(AO)(声明性和功能性分类之间的差异以及Dijkstra结构化的历史定义很明显) 关于难以给出正式定义的困难:令人惊讶的是,以某种逻辑(正式)系统(最有可能基于类型)的形式给出OOP的数学描述,并一个接一个地定义一个概念非常容易。甚至可以尝试通过将形式主义应用于类型安全检查或新的语言设计方面来做一些更实际的事情,而不仅仅是抽象的娱乐或练习(还包括在直觉类型理论中对OOP的查找公式,从属类型,在FOL形式主义中独立地作为lambda计算)并仅使用类别理论)。这里的重点是毫不奇怪IMO最初对OOP的最不完全了解(在计算机工程中),使IMO的这种表达有很大的偏颇(有缺陷),并最终在之后几乎无法访问(因此几乎不对编程世界有所贡献-也许除了某些百分比会通过从应用程序世界中找回应用程序)集成到流行语言中)。 因此,是的,很难给出一个准确的“好”定义,而不仅仅是给出定义。但是我很高兴在这里提出这个问题,因为你们的经验和直接参与,伙计们。

5
函数式程序的可读性
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我对此感到很好奇,因为我在学习任何功能语言之前都回想起它们,我认为它们全都是可怕,可怕,难以理解的。既然我已经知道Haskell和f#,我发现花更少的时间来阅读更少的代码,但是那一点代码的功能远比命令语言中的等效功能要多得多,因此感觉像是纯收益,而且我并不是很极端在功能上练习。 这是我的问题,我不断地从OOP人士那里听到,功能样式非常难以理解。我很好奇是否是这种情况,并且我在自欺欺人,或者如果他们花时间学习一种功能语言,那么整个样式将不再比OOP更难以理解? 是否有人看到过任何证据或轶事,他们以一种或另一种方式频繁地说这句话?如果实际上编写功能的可读性较低,那么我不想继续使用它,但是我真的不知道是否是这种情况。

4
为什么面试官不要求申请人阅读一些代码?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我一生中有十几次面试(我即将毕业),我想知道为什么只要求我阅读和解释一些代码。大约90%的工作主要是关于维护现有系统。IMO读取他人代码的能力是一项重要技能。 为什么面试官不检查它?* * 在我的朋友中,我是唯一被要求检查一些代码的人。

2
什么时候应该使用StringBuilder或StringBuffer?
在生产型Web应用程序中,我的同伴程序员在各处都使用StringBuffer。现在,我负责应用程序的开发和更正。阅读StringBuilder和StringBuffer之后,我决定将所有StringBuffer代码替换为StringBuilder,因为我们不需要数据bean中的线程安全。 例如:(在每个数据bean中,我都可以看到StringBuffer的使用) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } 我们为每个会话/请求创建一个单独的数据bean。会话由单个用户使用,其他用户无法访问它。 在迁移之前,我还应该考虑其他几点吗? 如果只有一个线程(没有等待线程/没有新线程将寻找对象锁定),则它与StringBuffer或StringBuilder的性能相同。我知道在使用StringBuffer的情况下,需要花费时间来获取对象锁,但是我想知道除了保持/释放对象锁外,它们之间是否存在任何性能差异。

6
所有编程问题都是算法问题吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我喜欢Cormen等人的“算法简介”。传达知识。原因之一是,一切都与编程问题有关,而本书并未以任何特定的编程语言来实现。这种语言独立性使人们可以集中精力于总体思路。 所以我的问题是,正如标题中所说。通过以这种算法方式进行思考,是否可以解决所有可解决的编程问题。无论哪种语言,领域等等?如果是,请给参数,否则请给参数! 我还没有使用GUI,AI,图形等实现许多复杂的程序。但是,这些类型的问题是否也在考虑好的算法上?
13 algorithms 

3
您如何摆脱代码维护者的角色?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 在最近的三份工作中,我是代码维护者。在这三种情况下,我都已经为该项目编写了大部分代码后才被雇用。 我是一个自学成才的程序员。在开始我的第一份专业工作之前,我大概有十几个项目可以成功启动并交付。 编写新代码和维护现有代码是两个完全不同的工作。就像将航空工程师和飞机技师进行比较。 当您是由一名工程师设计的飞机机械师,而该工程师没有试图使飞机以任何逻辑或易于维护的方式设计时,这种情况尤其糟糕。 我开始感觉像在项目刚开始时就在身边,您必须是那些以某种方式超越了计算机科学领域其他人员的特殊人员之一。处于那个位置需要什么? 我觉得这个问题确实没有简单的答案,但是有人可以给我一些见解吗?您曾经在一个新项目的底层吗?到达那里需要什么?

6
集合请求将有零个项目时的预期行为
假设您得到以下信息... List<Thing> theThings = fubar.Things.All(); 如果没有什么可以返回的,您期望fubar.Things.All()返回什么? 编辑:感谢您的意见。我会稍等一下,并接受最多的评论。 我同意到目前为止的回应,尤其是那些建议收藏空的回应。供应商为API提供了多次调用,类似于上面的示例。去年,通过其API实现收入460万美元的供应商BTW。他们做了我根本不同意的事情-他们抛出了异常。
13 java  c# 

3
您将如何测试Google Maps的“获取路线”功能?
(我想这将是一个很好的面试问题,但就我而言,这比这更为实际。) 我们有一个庞大而复杂的应用程序,可以对数十种化学成分之间极其漫长而复杂的化学反应过程进行建模。我们正处于为应用程序设计验收测试的阶段,但是对于可能的测试路径数量之多,我们有些畏缩。在我看来,我们的情况非常类似于Google Maps开发团队在其“获取路线”功能中测试路线规划算法时必须面对的情况。显然,他们无法测试(验证和验证)所有可能的路线。那么,他们如何使自己的应用程序在任何情况下都能运行的信心? 而且由于我不希望知道他们是如何做到的,所以让我问您:您将如何设计一个具有足够代码覆盖率的测试套件,以使自己确信给定的应用程序是健壮的,而这在实际上是不可能的探索整个系统的每条潜在路径? 我正在寻找的原则是您可以用来将棘手的问题分解成较小的,易处理的部分,这些部分的总和提供了令人满意的整体估计:“我无法测试所有内容,但我可以对此进行测试,这个和这个-就足够了。” 考虑到实际的预算/时间限制,我并不是在寻找一种“证明是正确的”方法,而是一种审慎的方法。 (我将Google Maps示例用作箔纸,以寻求尽可能具体的答案。)

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.