软件工程

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


8
什么是精美代码?[关闭]
我经常读到开发人员必须编写漂亮的代码,但是对于我这样的初学者来说,对于什么是漂亮的代码以及您如何识别它仍然不甚了解。 必然的问题是:如何编写漂亮的代码以及提高代码质量的一些实践习惯?,我应该关心什么来使我编写的代码漂亮(以及应该学到什么)。

1
动态表单生成器表单和数据库设计?[关闭]
假设您的用户可以创建自己的基于Web的表单(文本框,选择框等),然后将其发布到Web上以供用户填写。 是否有人有资源或关于如何构建数据库以将其绑定到动态表单方面的建议? 例如,您会为每个表单或给定表单的不同版本创建一个子表吗?

2
将指称语义学应用于程序设计
我已经读过一些有关指称语义(DS)的文章,并且对设计计算机程序的过程非常感兴趣,在计算机程序中,类型和功能与数学之间有着牢固而清晰的映射。 是否有任何资源详细讨论了基于DS的设计程序?我已经看到了对该主题的一些表面处理。 我精通Haskell,Scala,Common Lisp和一些Scheme,因此使用这些语言的任何资源都将受到赞赏。
30 scala  haskell  scheme 

3
“开始”,“运行”或“执行”方法是一种好习惯吗?
我目前正在开发具有许多实现Start方法的类的代码库。在我看来,这似乎是两阶段构建,我一直认为这是一种不良做法。我不能说这和构造函数之间的区别。 什么时候适合使用start方法而不是普通的对象构造方法? 我何时应该更喜欢使用构造函数? 编辑:我不认为这是相关的,但是编程语言是C#,它同样适用于Java或C ++


2
像Git Flow这样的合并策略真的是一种反模式吗?
我的公司正在使用Git,并且正在使用一种特殊的分支方案-工作是在master中完成的,分支保留用于发布。只要在迭代中完成的所有工作都可以进入分支,就可以很好地工作,但是,如果出现关键的生产问题,我们必须确保将工作以某种方式进入两个分支。 最近,我们在那些分支机构中获得了一些“乐趣”。这一直是管理上的头疼事,要确保所有工作都进入每个分支,并且某个分支上已修复的一些错误只有在有人指出时才成为主要问题。 我前段时间遇到了Git Flow,我觉得这将解决我们的问题-代码不会一直渗透到发行版中,也不会渗透到整个发行版中。唯一的收获是我的领导说这种发展是一种反模式-疯狂发展了两个星期,然后花了三个星期来解决合并冲突。 我不确定自己是否同意,并且自提出以来,工作恢复正常了。直到最近,我们才有了一些重大的痛点。 我想知道-为什么将这种开发方案视为反模式? 是真的反模式?

11
“第四维”如何与数组一起使用?
抽象: 因此,据我了解(尽管我了解的非常有限),我们(通常)在物理上涉及三个方面: 第一个将由一条线表示。 第二个将由一个正方形表示。 第三个将由一个多维数据集表示。 很简单,直到我们进入第四位 -如果您知道我的意思,那么很难在3D空间中绘制...有些人说这与时间有关。 问题: 现在,尽管这并没有多大意义,但对我来说,这一切都很棒。我的问题不是这个,或者我会在MathSO或PhysicsSO上问它。我的问题是:计算机如何处理数组? 我知道您可以使用许多不同的编程语言创建4D,5D,6D等数组,但是我想知道它是如何工作的。
30 theory  array 

7
我应该测试继承的方法吗?
假设我有一个从基类Employee派生的类Manager,并且该Employee有一个由Manager继承的方法getEmail()。我是否应该测试经理的getEmail()方法的行为实际上与员工的行为相同? 在编写这些测试时,其行为将是相同的,但是当然在将来的某个时候,有人可能会重写此方法,更改其行为,从而破坏我的应用程序。但是,从根本上测试是否存在干预代码似乎有些奇怪。 (请注意,在创建/覆盖Manager :: getEmail()之前,测试Manager :: getEmail()方法不会提高代码覆盖率(或其他任何代码质量指标(?))。 (如果答案是“是”,则有关如何管理基类和派生类之间共享的测试的一些信息将很有用。) 问题的等价表述: 如果派生类从基类继承方法,则如何表达(测试)是否期望继承的方法: 行为与现在的基础完全相同(如果基础的行为发生了变化,则派生方法的行为不会发生变化); 始终具有与基类完全相同的方式(如果基类的行为发生变化,派生类的行为也发生变化);要么 但是,它要表现出来(您不必关心此方法的行为,因为您从不调用它)。

7
我什么时候应该编写集成测试?
根据TDD的规则,单元测试是在生产代码之前编写的,但是,在具体(非模拟)有线对象之间进行交互的集成测试又如何呢? 它们应该在单元测试之前还是在生产代码之后编写,仅用于测试“接线”? 请注意,我不是在谈论验收或功能测试,而是在进行较低级别的集成测试。

3
何时将一个项目分成多个子项目
我想知道将我正在处理的项目分成两个存储库而不是一个存储库是否有意义。 从我可以说: 前端将用html + js编写 .net后端 后端不依赖于前端,前端不依赖于后端 前端将使用后端实现的一个宁静的api。 前端可以托管在任何静态http服务器上。 到目前为止,存储库具有以下结构: 根: 前端/* 后端/ * 我认为将两个项目都放在同一个存储库中是一个错误。由于两个项目之间没有相互依赖关系,因此它们应属于单独的存储库,并且如果需要,则应具有包含子模块的父存储库。 有人告诉我这是没有意义的,这样做不会给我们带来任何好处。 这是我的一些论点: 我们有两个互不依赖的模块。 长期拥有两个项目的源历史记录可能会使事情复杂化(尝试在历史记录中搜索前端中的某些内容,而您有一半的提交与所寻找的bug完全无关) 冲突和合并(这不应该发生,但是让某人推送到后端将迫使其他开发人员提取后端更改以推送前端更改。) 一个开发人员可能只在后端工作,但总是不得不拉扯前端或反过来。 从长远来看,将是时候进行部署。以某种方式,前端可以在拥有一个后端服务器的同时部署到多个静态服务器。在每种情况下,人们都将不得不要么克隆整个后端,要么创建自定义脚本以仅将所有前端推送到所有服务器或删除后端。如果只需要一个,则仅推/拉前端或后端比两个都容易。 反驳论点(一个人可能同时在两个项目上工作),使用子模块创建第三个存储库并进行开发。历史记录保存在各个模块中,您始终可以创建标签,在这些标签中,后端/前端的版本确实可以同步工作。将两个前端/后端放在一个仓库中并不意味着它们可以一起工作。它只是将两个历史合并到一个大型仓库中。 如果要将自由职业者添加到项目中,将前端/后端作为子模块将使事情变得更容易。在某些情况下,您实际上并不想授予对代码库的完全访问权限。如果您想限制“局外人”可以看到/编辑的内容,拥有一个大模块将使工作变得更加困难。 错误介绍和修复错误,我在前端插入了一个新错误。然后有人修复了后端的错误。对于一个存储库,在新错误之前回滚也将回滚后端,这可能使其难以修复。我必须将后端克隆到另一个文件夹中,以使后端工作,同时修复前端中的错误……然后尝试重新合并东西……拥有两个存储库将很轻松,因为移动了一个回购的HEAD不会改变另一个。并且针对不同版本的后端进行测试将是轻而易举的。 有人可以给我更多的论据来说服他们,或者至少告诉我为什么将项目分为两个子模块是没有意义的(更复杂的)。该项目是新项目,代码库已有两天的历史,因此修复还为时不晚。

2
python工厂函数最佳实践
假设我有一个foo.py包含类的文件Foo: class Foo(object): def __init__(self, data): ... 现在,我想添加一个函数,该函数Foo以某种方式从原始源数据创建对象。我应该将其作为Foo中的静态方法还是另一个单独的函数? class Foo(object): def __init__(self, data): ... # option 1: @staticmethod def fromSourceData(sourceData): return Foo(processData(sourceData)) # option 2: def makeFoo(sourceData): return Foo(processData(sourceData)) 我不知道方便用户使用是否更重要: foo1 = foo.makeFoo(sourceData) 还是在方法和类之间保持清晰的耦合更重要: foo1 = foo.Foo.fromSourceData(sourceData)
30 design  python 

3
如何与善意的开源贡献者打交道?
如果程序员与您联系并要求为您的项目做出贡献,您将如何处理? 你不知道这个家伙有什么用。也许他会比自己值得的麻烦更多。 他可能正试图将自己的名字附加到一个成功的项目上,以示敬意。 他可能会尝试将项目推向您真正不想要的方向,添加您认为不值得额外复杂的功能。 或者,他可能是一个非常有用的贡献者。你就是不知道 您如何处理您不认识的人的此类请求(特别是在GitHub上,如果有什么不同)?这是什么礼节?

5
香槟喷泉之谜
空杯子的水按以下顺序排列: 当您将液体倒入第一个玻璃杯中时,如果充满了液体,则多余的液体将以相同的数量流入玻璃杯2和3。当玻璃2充满时,多余的液体将流入4和5,依此类推。 给定N升的液体,每个玻璃的最大容量为1升,如果通过填写getWaterInBucket(int N, int X)X代表玻璃编号的函数倒入玻璃中来倒空N升的液体,则给出任何玻璃中存在的液体量。因此,例如,如果我想开始时有4升水,而我想在玻璃杯3中找到水,则功能为getWaterInBucket(4, 3) 如何以编程方式解决此问题?我试图使用Pascal的三角形找到数学解决方案。这没有用。我认为它是一棵树,因此我可以添加一个这样的参数getWaterInBucket(BTree root, int N, int X),然后为每个级别尝试一些递归解决方案,但是此问题中不允许使用参数。有明显的东西吗?

6
当驾驶员和观察员具有不同的技能水平和经验时进行配对编程
我知道结对编程是一种敏捷的软件开发技术,其中两个程序员在一个工作站上一起工作。一个是驱动程序,编写代码,另一个是观察程序,查看键入的每一行。 但是我只是想知道这种策略在这种情况下是否仍然有效。例如 如果他们有非常不同的编程技能水平。 如果一个人从未在问题领域经历过,而另一个人则在经历过。 如果他们的编程技能水平低,还可以吗? 您能建议上述情况下的结对编程策略吗?

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.