软件工程

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

10
我的团队如何在重构后避免频繁的错误?
为您提供一些背景知识:我在一家大约有十二名Ruby on Rails开发人员(+/-实习生)的公司工作。远程工作很普遍。我们的产品由两部分组成:一个相当肥大的核心,然后精简到以此为基础的大客户项目。客户项目通常会扩展核心。不会覆盖关键功能。我可能还会补充说,核心中有一些非常糟糕的部分,这些部分迫切需要重构。有规格,但主要针对客户项目。核心的最差部分未经测试(不是应该的……)。 开发人员分为两个团队,每个sprint使用一个或两个PO。通常,一个客户项目严格与团队和PO之一相关联。 现在我们的问题是:我们经常破坏彼此的东西。A团队的某人扩展或重构了核心功能Y,从而为B团队的一个客户项目造成了意外错误。通常,更改不会在团队中宣布,因此这些错误几乎总是无法预料的。包括PO在内的B团队认为功能Y是稳定的,并且在发布之前未对其进行测试,并且没有意识到更改。 如何摆脱那些问题?您可以推荐我什么样的“公告技术”?


4
帮助一个并非永远不会成为职业程序员的人,将可以编写出更清晰易懂的代码,以供使用和解释。
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我是猫王,努力学习成为爱因斯坦。我为Mort工作。 这个疯子白痴在说什么!?!?(您只需要阅读前几段) 如果您不想阅读该链接,那么基本上,我是一名专业程序员,而我的老板是(这非常准确): 缺乏计算机科学学位但对Office和VBA十分熟悉的专业业务线程序员,通常编写在同事之间共享的生产力应用程序 话虽这么说,我的大部分工作是将他拼凑的代码准备好并投入生产。但是,非常差的风格和杂货主义使这变得困难。他不愿意阅读编程书籍或不愿意让我帮助他重构代码,这使情况更加复杂。 还有其他一些策略可以帮助不是专业程序员的人,也永远不会成为专业程序员编写对我而言更易读和易用的代码吗?

4
如何记录Java程序的高级结构?
背景: 我和我的合作者正在为学术期刊撰写文章。在研究过程中,我们用Java编写了一个仿真程序。我们想让仿真程序免费供其他人使用。我们已决定将代码托管在GitHub存储库上。为了使其他人易于使用,我们希望为程序编写良好的文档,包括: 每个类和方法的Javadocs 如何使用代码 描述代码的高级结构 我的高级问题是: 您能否提供一个可以用来描述程序高级结构的单词和图表的好例子? 这包括作为子问题: 我们如何显示哪些包中包含哪些类? 我们如何显示哪些软件包依赖于其他软件包? 我们如何显示程序中的对象/类如何协同工作? 我们已尝试在代码设计中使用领域驱动的设计原则。我们如何显示域中的对象与编码这些对象的特定源代码文件之间的对应关系?(请参阅下面我对项目的“通用语言”说明。) 到目前为止我做了什么 无处不在的语言 我们将代码的“普遍语言”描述放在文件中ubiquitous-language.md,内容如下。 该项目的目的是研究在不同的提前期模型,报告延迟和需求模型下,补货策略在具有单个设施的简单供应链中的执行情况。 在每个期间,发生以下事件: 如果计划在当前期间将货物运送到工厂,则工厂的库存水平将增加X单位。 如果计划表指示当前期间为报告期,则工厂将向 供应商提交报告。该供应商可能会收到报告 瞬间,或者几个星期的延迟,由指定的时间表。 如果供应商已收到报告,则根据 补货策略,它将计算X单位的补货数量。一个出货的产品的X单位将被安排升周期的筹备时间之后抵达。 客户到达工厂并需要X单位的产品。任何未满足的需求都会丢失。 源代码结构 我们在structure.md下面的文件中放置了不完整的代码“高级”描述。 包装等级结构 在最高级别,源代码分为三个包 com.gly.sfs 该main方法的主类位于此程序包中。 com.gly.sfs.model 域模型类驻留在此程序包中。 com.gly.sfs.util 帮助程序类驻留在此程序包中。

1
命名空间与在PHP中包含/要求的优缺点?
我最近开始在PHP中使用名称空间。当我第一次看到它们时,我认为它们的语法很丑陋,我永远不会使用它们。但是,我创建了一个自动加载器(spl_autoload_register),这样就不必再编写include / require语句了。 我喜欢名称空间,但是与include / require语句相比有客观的好处吗?或者它们是实现相同目标的完全相同的方法吗?
20 php  namespace 

2
Monad是继承层次结构的可行替代方法吗?
我将使用像monads这样的语言不可知的描述,首先描述monoid: 甲独异是(大约)的一组需要一些类型作为参数并返回相同的类型的功能。 甲单子是(大约)的一组需要的功能封装器类型作为参数并返回相同的包装类型。 注意这些是描述,而不是定义。随意攻击该描述! 因此,在OO语言中,monad允许以下操作组合: Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() 请注意,monad定义并控制这些操作的语义,而不是所包含的类。 传统上,在OO语言中,我们将使用类层次结构和继承来提供这些语义。因此,我们将有一个Bird带有方法takeOff(),flyAround()和的类land(),而Duck将继承这些方法。 但是后来我们遇到了不能飞的鸟,因为penguin.takeOff()失败了。我们必须求助于异常抛出和处理。 另外,一旦我们说企鹅是a Bird,我们就会遇到多重继承问题,例如,如果我们也有的层次结构Swimmer。 本质上,我们试图将类归类(对“分类论”的人道歉),并按类别而不是单个类来定义语义。但是,与层次结构相比,monad似乎是一种更清晰的机制。 因此,在这种情况下,我们将有一个Flier<T>单子,如上面的示例: Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() ...而且我们永远不会实例化一个Flier<Penguin>。我们甚至可以使用静态类型来防止这种情况的发生,也许使用标记接口。或运行时功能检查以纾困。但是,实际上,程序员切勿将企鹅放入Flier,从同样的意义上讲,它们切勿除以零。 而且,它更普遍适用。飞行器不必一定是鸟。例如Flier<Pterodactyl>或Flier<Squirrel>,而不更改这些单个类型的语义。 一旦我们通过容器上的可组合函数对语义进行了分类(而不是按类型层次结构进行分类),它就解决了“某种行为,某种行为不适合”特定类的旧问题。它还轻松明确地为一个类提供了多种语义,例如Flier<Duck>和Swimmer<Duck>。似乎我们一直在通过按类层次结构对行为进行分类来应对阻抗不匹配的问题。Monad优雅地处理它。 因此,我的问题是,就像我们倾向于偏爱组成而非继承一样,偏爱单子而不是继承是否也有意义? (顺便说一句,我不确定是应该在这里还是在Comp Sci中使用,但这似乎更像是一个实际的建模问题。但是也许在那儿会更好。)

5
作为“最低开发商”与技术债务作斗争?
假设您在一家公司工作,而您所要做的就是为他们开发软件。您不了解总体情况,也可能不了解。您所拥有的是通过问题跟踪系统分配给您的任务。您得到了任务,使它们按照任务描述它们的方式工作,然后将其发回。像加2个整数: function add(a,b){return a + b;} 但是后来,随着项目的进行,您注意到随着add变得越来越复杂,您意识到它应该需要某种形式的体系结构,而不仅仅是添加参数并返回值的函数。但是,您不知道。首先,他们所需要的就是这么简单add。您没想到add会变得如此复杂。 该项目具有更多功能,而您最初没有想到这些功能。最后,您将不断堆积各种技巧和功能,以免破坏/重写现有代码。 您如何处理这些情况?作为“最低开发商”,您如何应对技术债务? 澄清: 您是层次结构中最低的“实施者”。 您看到了问题,但对此没有发言权。 我不是在量化技术债务或寻找工具。 关于第三个“重复” 重构和重写-您被锁定在任务上。您无需支付额外费用。 体系结构概述-您了解整个系统,但不了解体系结构。 代码冻结-不是您的电话。您不是管理者。 模块化-不了解架构。模块随需求的变化而变化。 自动化测试-不存在。


7
静态数据应该存储在数据库中还是其他地方?
我目前正在开发某些软件,但不确定该采用哪种方法。我有一些数据要存储在移动设备上的某个地方。数据将永远不会改变,并具有层次关系,并将用于填充显示。有相当数量的此数据。 我有以下选择: 一组枚举/对象 XML文件 嵌入式SQLite数据库 在这种特殊情况下,我认为enums选项的工作量最少,但是我从这样的代码中嵌入的数据中获得了味道。 我认为XML文件最有意义,但是解析它会浪费资源,因为它永远不会改变。 数据库应该不会对性能造成太大的影响,但是对于静态数据来说似乎有点过分了。 这里正确的设计路径是? 注意: “永不更改”是指更改很少。有问题的数据是一组政府标准的模型,因此它们将来很可能会发生变化,但它不会定期更新,也不会自动更新我们的软件,因为标准的变化很可能会触发我们需求的变化。
20 design 

6
有没有超高级语言?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 从历史上看,HLL类似于C,Fortran或Pascal,而VHLL则类似于Ruby或Python。我熟悉术语4GL,5GL,DSL和LOP,那些不熟悉的人应阅读Wikipedia的定义。我正在寻找UHLL。 我的问题是:是否有计算机语言可以提高生产力另一个数量级,有人在使用它们吗? 更高的生产力意味着更少的编写代码和更少的程序员获得结果,更少的错误和更少的调试,更紧密的代码和需求之间的概念联系,更少的修改和维护工作。 我感兴趣的主要领域是通用业务和消费者应用程序,具有GUI或浏览器前端,数据持久性以及与其他系统(如打印和电子邮件)的连接。其他人可能会专注于其他地方。 我认识到,其中某些语言可能是特定于域的,它们可能仅比大型且功能强大的应用程序的配置功能多。Excel电子表格属于此类别。 我认识到其中一些语言可能看起来很笼统,但范围可能仍然狭窄,不适合许多问题。例如,对于主要处理用户交互和文本数据的程序,Matlab可能不是一个好的选择。 类似于VHLL,我知道UHLL中可能包含的一些功能。我希望找到以下一个或多个(并随时添加到列表中): GUI表单的图形是用于GUI表单的程序 包含行,列和标题的表是数据库中表的程序 声明式逻辑表示在没有IF语句的情况下应该执行的操作以及何时执行 对数据集进行操作,无FOR循环 非顺序执行,例如数据驱动,模式匹配,树遍历 这个问题的动机是,我越来越厌倦了将相对简单的业务需求转换为大量代码来满足计算机需求的艰巨的工作。问题的实质是找到其他与我分担痛苦并致力于提高语言水平并让计算机完成更多艰苦工作的人。这是1970年代至80年代的主要关注点,但是它还在发生吗? 这些是对我的问题的一些建议答案,在此提供它们是为了总结或枚举我所知道的语言,而我认为这是不足的。 有许多语言是HLL或VHLL,并且包含属于较高级别的单个功能。我用了大多数(通常很糟)。它们包括 Lisp,具有其宏和自我修改的能力 Haskell,具有数据依赖性和模式匹配 SQL,处理行和表 Rebol,看起来很聪明,但我真的不明白 APL(和J)及其多维数组和超紧凑运算符 C#与LINQ AWK / Perl / Python / Ruby内置了出色的集合和正则表达式 这些语言具有太多的低级功能,无法成为UHLL。程序员仍然必须为任何有用的程序编写许多底层构造。 有RAD / 4GL软件包。我用过一些: dBase / Foxpro Dataflex / Powerflex(我的产品) 访问 PowerBuilder的 还有很多我没用过的。通常,语言充其量是HLL,但该软件包包含框架和语言与软件包之间的特权连接,因此可以快速构建应用程序。我不确定为什么这种方法没有用尽,但是无论如何不是这样。 有原始框架/库。我用了一些: 滑轨 Java AWT和Swing .NET …

7
如何最好地保护传递给std :: string参数的0?
我刚刚意识到一些令人不安的事情。每次我编写一个接受std::string参数为a 的方法时,我都会向不确定的行为敞开大门。 例如,这... void myMethod(const std::string& s) { /* Do something with s. */ } 可以这样称呼 char* s = 0; myMethod(s); ...而且我无能为力(我知道)无法阻止它。 所以我的问题是:某人如何捍卫自己呢? 想到的唯一方法是,始终编写接受a std::string作为参数的任何方法的两个版本,例如: void myMethod(const std::string& s) { /* Do something. */ } void myMethod(char* s) { if (s == 0) { throw std::exception("Null passed."); } else { …
20 c++ 

4
空接口以合并多个接口
假设您有两个接口: interface Readable { public void read(); } interface Writable { public void write(); } 在某些情况下,实现对象只能支持其中之一,但在很多情况下,实现将支持两个接口。使用界面的人员将必须执行以下操作: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation MyObject myObject …

2
为什么Java不将文件名放在args中?
在C和C ++中,main方法将文件名保存在数组的第一个位置argv [0]处。但是,在Java中,文件名不包含在args字符串数组中。 是否有实际原因?我知道这使得通过命令行参数从0开始而不是从1开始进行迭代,但这有好处吗?文件名只是被认为是无用的吗?
20 java  c++  c 

4
何时使用存储库模式
我最近读到,将存储库模式与ORM结合使用不是一种好习惯。从我的理解来看,这是因为它们在SQL数据库上提供的抽象太泄漏而无法包含在模式中。 我对此有两个问题: 如果要转出ORM,该怎么办?如果您未在存储库中包含ORM特定代码,则您的应用程序中将包含该代码。 当不使用ORM且您正在使用ADO.NET进行数据访问并自己填充对象数据时,存储库模式仍然有效吗? 如果您使用ORM而不是存储库模式,那么将常用查询保留在哪里?将每个查询表示为一个类并具有某种查询工厂来创建实例是否明智?

4
什么时候以及如何使用例外?
那个设定 我经常很难确定何时以及如何使用异常。让我们考虑一个简单的示例:假设我正在抓取一个网页,说“ http://www.abevigoda.com/ ”,以确定Abe Vigoda是否还活着。为此,我们要做的就是下载页面并寻找出现“ Abe Vigoda”短语的时间。我们返回首次亮相,因为其中包括安倍晋三的身份。从概念上讲,它将如下所示: def get_abe_status(url): # download the page page = download_page(url) # get all mentions of Abe Vigoda hits = page.find_all_mentions("Abe Vigoda") # parse the first hit for his status status = parse_abe_status(hits[0]) # he's either alive or dead return status == "alive" where parse_abe_status(s)以“ …

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.