软件工程

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

3
为什么要使用Android Fragments?
我已经阅读了有关该主题的文档和其他一些问题的主题,但我并没有真正感到信服。我看不出使用此技术的局限性。 片段现在被视为最佳实践 ; 基本上,每个活动都应该是对一个或多个片段的支持,而不是直接调用布局。 创建片段是为了: 允许Activity使用多个片段,在它们之间进行切换,重用这些单元... ==> Fragment完全依赖于ContextActivity的,因此,如果我需要可以在许多Activity中重用和处理的通用类,创建自己的自定义布局或视图...我不会在意片段会添加的这个额外的复杂性开发层。 对于平板电脑/手机,更好地处理不同分辨率==>确定,以防长时间处理,我们可以在平板电脑的“同一活动”中显示两个(或多个)片段,在手机中一个一个地显示。但是为什么我总是使用片段? 处理在片段之间导航的回调(即:如果用户已登录,则显示一个片段,否则显示另一个片段)。===>试着看看有多少bug导致了Facebook SDK登录,以了解它确实是(?)... 考虑到Android应用程序是基于活动的...在活动中添加另一个生命周期会更好地设计应用程序...我的意思是模块,方案,数据管理和连接性会得到更好的设计,因为办法。===>这是一个曾经用Fragments愿景看过Android SDK和Android Framework的人的答案。我不认为这是错误的,但是我不确定它是否会产生良好的结果。而且它真的很抽象。 ====>为什么总是使用它们会使我的生活变得复杂,编写更多代码?否则,如果它只是某些情况下的工具,那为什么是最佳实践呢?这些情况是什么?

4
在运行时将字段添加到类中-设计模式
想象一下,您的客户希望有可能在其CMS的eshop中为产品添加新属性(例如颜色)。 而不是将属性作为字段: class Car extends Product { protected String type; protected int seats; } 您可能最终会做类似的事情: class Product { protected String productName; protected Map<String, Property> properties; } class Property { protected String name; protected String value; } 也就是说,在现有系统之上创建自己的类型系统。在我看来,这可以看作是创建域特定的语言,还是不能? 这种方法是已知的设计模式吗?您会以不同的方式解决问题吗?我知道可以在运行时中添加字段的语言,但是数据库呢?您是愿意添加/更改列还是使用上图所示的内容? 感谢您的时间 :)。

5
处理大量拉取请求
我目前正在与一个使用git工作流程的团队一起进行项目。这非常简单,master应该处于可部署状态,并且分支用于创建功能和修补程序。每当我们完成并测试了功能或错误修正后,我们就会尽快将其移交给母版。想法是分支应该尽可能小,以使其更易于合并回主节点。我们有一个政策,即任何推送到master分支的代码都应处于可部署状态并通过测试。 我们遇到这样的情况,其中一个开发人员在一个分支上做了很多工作(几个月的价值),而这个分支还没有被合并回master。现在,该分支上有一些单独的功能和大量提交,实际上,该分支确实应该已经合并了几次,但到目前为止还没有合并。大多数代码处于良好的状态,可以将单元测试合并回到主测试中,但是最近的更改肯定不应该如此,因为它们尚未完成且未经测试。 处理这样一个分支实际上与另一个分支相距甚远的情况的最佳方法是什么?将来,我们可以通过哪些方式避免分支从master获得大量提交?
15 git  workflows 

3
为什么接口在实现松散耦合方面比父类更有用?
(出于这个问题的目的,当我说“接口”时,我的意思是语言结构interface,而不是用另一种意义上的“接口”,即,一个类提供了与外界进行交流的外部方法,并且操纵它。) 松散耦合可以通过使对象依赖于抽象而不是具体类型来实现。 这允许松散耦合,主要有两个原因:1-与具体类型相比,抽象的更改可能性较小,这意味着从属代码中断的可能性较小。2-不同的具体类型可以在运行时使用,因为它们都适合抽象。以后也可以添加新的具体类型,而无需更改现有的从属代码。 例如,考虑一个类Car和两个子类Volvo和Mazda。 如果您的代码依赖于Car,则可以在运行时使用Volvo或Mazda。同样,以后可以添加其他子类,而无需更改从属代码。 另外,Car-是一种抽象-,更改的可能性小于Volvo或Mazda。汽车在相当长的一段时间内大体相同,但沃尔沃和马自达的变化可能性更大。即抽象比具体类型更稳定。 所有这些都是为了表明我理解什么是松散耦合以及如何通过依赖抽象而不是依赖具体实现来实现松耦合。(如果我写的东西不准确,请这样说)。 我不明白的是: 抽象可以是超类或接口。 如果是这样,为什么接口因其允许松耦合而受到特别赞扬?我没有看到它与使用超类有什么不同。 我看到的唯一区别是:1-接口不受单一继承的限制,但这与松耦合这一主题无关。2-接口更加“抽象”,因为它们根本没有实现逻辑。但是,我仍然不明白为什么会有如此大的不同。 请向我解释为什么说接口在允许松散耦合方面是很棒的,而简单的超类却不是。

4
谁拥有开源项目中贡献的代码的权利?
如果有人在某个人将做出贡献的地方开始一个开源项目(例如,具有GPL许可证),那么在整个项目级别上谁将拥有这些贡献?新代码是否将成为原始作者的财产,或者贡献者也将是作者? 谁拥有正在进行的项目的权利?例如,谁有权发布第二个许可证中的代码?仅原作者?投稿人可以分别做吗,还是必须与原始作者和所有投稿人共同做出决定?

3
如何支持不同的API版本
我正在编写Rest API,并且想知道如何最好地处理对不同版本的支持。这样,我不是要如何将URI定义为V2或V3,而是要根据需要构造代码: 同时支持多个版本,例如。V1&V2&V3 URI必须同时存在。当说V4来限制任何时候的支持量时,我将退出V1。 避免尽可能多的代码重复 轻松向一个版本添加不间断的更改,而不会影响其他版本 似乎可以采取的方法很少: 使用Git来控制版本,并为不同的版本提供分支(旧版本基本上不需要进行新的开发工作)。这将意味着没有代码重复,因为代码中只有最新版本,但是以前的版本将需要与DB的新版本一起使用,直到淘汰。 复制代码,以便每个版本都在同一应用程序中处理,并且具有完全独立的代码路径,但这将意味着大量重复 在各个版本中重复使用大量代码,但这将使维护变得困难,因为更改一个版本更可能影响先前版本 所有选项似乎都有自己的问题,是否有最佳实践来解决此问题?

4
4 + 1架构视图模型与UML之间的映射
我对4 + 1架构视图模型如何映射到UML感到有些困惑。 维基百科提供了以下映射: 逻辑视图:类图,通讯图,顺序图。 开发视图:组件图,包装图 流程视图:活动图 物理视图:部署图 方案:用例图 纸张UML时序图的构建在对象生命周期概念作用提供了以下映射: 逻辑视图(类图(CD),对象图(OD),序列图(SD),协作图(COD),状态图图(SCD),活动图(AD)) 开发视图(包装图,组件图), 流程视图(用例图,CD,OD,SD,COD,SCD,AD), 物理视图(部署图),以及 结合了上述四个方面的用例视图(用例图,OD,SD,COD,SCD,AD)。 网页UML 4 + 1 View Materials提供了以下映射: 最后,白皮书《将4 + 1视图架构与UML 2结合使用》给出了另一个映射: 逻辑视图类图,对象图,状态图和组合结构 过程视图顺序图,通讯图,活动图,时序图,交互概述图 开发视图组件图 物理视图部署图 用例视图用例图,活动图 我相信进一步的搜索也会揭示其他映射。 尽管各种人通常有不同的看法,但我不明白为什么会出现这种情况。特别地,每个UML图都从特定方面描述系统。那么,例如,为什么一位作者认为“顺序图”描述了系统的“逻辑视图”,而另一位作者却认为它描述了“过程视图”呢? 您能帮我澄清一下混乱吗?
15 architecture  uml  model  view 

2
版本号作为文件名的一部分
我看到某些软件的文件名中包含版本号,而其他软件则没有。我更习惯于后一种类型,并且我认为这种类型更为流行,但是有时我在javascript库中看到前一种类型。例如,jQuery的文件名为like jquery-2.1.0.js而不是jquery.js。每当我更新这些类型的文件时,都必须在其他程序中查找加载这些文件的位置,并更改它们所引用的文件名,并手动删除这些库的旧版本。这对我来说很不方便,因此我宁愿重命名文件以排除版本号,并保持所引用的文件名不包括版本号。 我怀疑这些数字是用于某种版本控制的,但是不清楚何时以及如何使用它们。 在文件名中包含版本号的优缺点是什么? 对于文件名中的哪些软件或语言区域使用版本号,而哪些区域/语言不使用版本号,是否存在事实上的共识?如果是这样,那有什么口粮吗?

1
团队工作(在OO项目中)如何工作?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我自己用非常面向对象的风格用Java编程。从来没有机会与其他程序员合作(至少我还不是专业人士)。 出于好奇,我想问:与团队一起进行项目工作如何工作,尤其是在进行OO项目时? 拆分任务如何工作?您如何开发可以与其他程序员开发的产品一起成功使用的产品? 程序员如何以及何时进行交流? 谢谢

7
我应该重构主要由一个正则表达式组成的大型函数吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我刚刚编写了一个跨越约100行的函数。听到这个消息,您可能很想告诉我有关单一责任的事,并敦促我进行重构。这也是我的直觉,但这是问题所在:函数做一件事。它执行复杂的字符串操作,并且函数主体主要由一个详细的正则表达式组成,分为许多行,并记录在案。如果我将正则表达式分解为多个功能,我会感觉实际上会失去可读性,因为我正在有效地切换语言,并且无法利用正则表达式提供的某些功能。现在是我的问题: 在使用正则表达式进行字符串操作时,大型函数体是否仍然是反模式?似乎命名捕获组的作用与功能非常相似。顺便说一下,我对通过正则表达式的每个流进行测试。

5
为什么要为将要重构的代码编写测试?
我正在重构一个巨大的遗留代码类。重构(我认为)主张: 为遗留类编写测试 摆脱困境 问题:一旦我重构了类,就需要更改步骤1中的测试。例如,以前是旧方法中的东西,现在可能是一个单独的类。一种方法现在可能是几种方法。遗留类的整个景观可能被抹杀为新的东西,因此我在步骤1中编写的测试几乎是无效的。本质上,我将添加步骤3。大量重写我的测试 那么重构之前编写测试的目的是什么?这听起来更像是为自己创造更多工作的学术活动。我现在正在为该方法编写测试,并且正在学习有关如何测试事物以及旧方法如何工作的更多信息。可以通过阅读旧代码本身来学习这一点,但是编写测试几乎就像在摸摸我的鼻子,并且在单独的测试中记录这种临时知识。因此,以这种方式,我几乎别无选择,只能学习代码在做什么。我在这里说的是暂时的,因为我会从代码中重构出乱七八糟的东西,并且我的所有文档和测试在很大程度上都是无效的,除非我的知识会留下来并使我对重构更加新鲜。 这是重构之前编写测试的真正原因-帮助我更好地理解代码吗?还有另一个原因! 请解释! 注意: 有一篇文章:没有时间进行完全重构时,为遗留代码编写测试是否有意义?但是它说“重构之前先写测试”,但没有说“为什么”,或者说“写测试”看起来像“很快就会被销毁的繁忙工作”该怎么办。

4
选择哪一个:XML属性或Sub节点?
我们希望将数据库中的某些数据导出为XML。例如,Person可以具有age,name和其他一些特性。 我们有两种选择来定义XML格式。 选择1: <Persons> <Person> <Age>16</Age> <Name>Richard</Name> </Person> <Person> <Age>34</Age> <Name>Eric</Name> </Person> ... </Persons> 选择2: <Persons> <Person Age="16" Name="Richard"/> <Person Age="34" Name="Eric"/> ... </Persons> 那么子节点或属性的定义有什么区别?每种选择的好处是什么?
15 xml 

5
一些团队成员没有积极参与Sprint计划
一些团队成员只是等到讨论他们最有可能从事的故事,然后才参与。否则,他们只会玩手机而不听。 我从某种程度上理解了这个立场。为什么要听有关您不太可能在Sprint中帮助开发的功能的讨论? 您认为我们应该怎么做?
15 agile  scrum 

5
我可以对IDE进行哪些更改以最大程度地减少阅读障碍的影响?
我编程,而且阅读困难。我的视野很好。我对符号的处理不善,是一个视觉化的思想家。 当我编写代码时,我比一般人要慢,因为我无法预料地没有意识到自己犯的错误。我正在学习python,只有文本的开发环境给我带来了很多视觉压力;我正在使用Wingware,该软件有些帮助,但无法在给定的时间内完成作业。 您能推荐一个对我有帮助的住宿吗? 哪些改编对我会有帮助? 有什么方法可以自动查找,突出显示和修复此类错误? 校对后,我看到了希望看到的东西或熟悉的东西。我没有发现错别字,跳过行等,并且在测试中出现了错误。即使是复制和粘贴,我也会错过行并导致错误。 边缘到边缘的文本块让我头痛,一些颜色组合也让我头疼 我不会将文本处理为符号,而是将对象旋转为可以旋转的对象,以便将数字中的数字移动到不同的位置,我可能会认为“ 123”为“ 132”,字母为“ pddq”,看起来与我。我认为这些技巧很棘手-旋转并反射相同的形状。

2
哪个更好:一堆吸气剂或带有选择字符串参数的1个方法?
我们的知识领域涉及人们赤脚行走在压力记录板上。如果在传感器数据中识别出人脚,我们会进行图像识别,从而产生“脚”类对象。 必须对脚的数据执行一些计算。 现在,哪种API更好: class Foot : public RecognizedObject { MaxPressureFrame getMaxPressureFrame(); FootAxis getFootAxis(); AnatomicalZones getAnatomicalZones(); // + similar getters for other calculations // ... } 要么: class Foot : public RecognizedObject { virtual CalculationBase getCalculation(QString aName); // ... } 现在,我可以提出很多优点和缺点,但是我不能真正决定哪个最重要。请注意,这是最终用户应用程序,而不是我们出售的软件库。 有什么建议吗? 第一种方法的一些专家可能是: 吻-一切都非常具体。API,但实施也是如此。 强类型返回值。 从此类继承是万无一失的。什么都不能覆盖,只能添加。 API是非常封闭的,什么都不会进入,什么都不能被覆盖,所以更少的地方会出错。 一些缺点: 随着我们发明的每一项新计算都被添加到列表中,吸气剂的数量将会增加 API更可能会更改,如果引入了重大更改,我们需要一个新的API版本,即Foot2。 如果在其他项目中重复使用该类,我们可能不需要进行所有计算 …

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.