软件工程

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

6
我们可以说对象具有属性,状态和行为吗?
我正在阅读Oracle对OOP概念的介绍,并且遇到了以下描述: 实际对象具有两个特征:它们都具有状态和行为。狗具有状态(名称,颜色,品种,饥饿)和行为(吠叫,抓捕,摇尾巴)。软件对象在概念上与现实世界中的对象相似:它们也由状态和相关行为组成。 我的问题是,当描述状态时,它的混合属性也存在。例如,狗的名字和颜色是它的属性,而饿或渴则是它的状态。 因此,我认为将对象的特征分为三个部分更为准确:属性,状态和行为。 当然,将其翻译成编程语言时,我可以看到三重分区变成了两重分区,因为属性和状态都将存储在字段/变量中,而行为将存储在方法/函数中。 但是从概念上讲,将三件事分开是更有意义的。 这是另一个示例:考虑一盏灯。在我看来,说灯泡的大小以及它是否已打开都是状态。灯的大小是属性,而不是状态,而打开或关闭是状态。 还是我错过了什么?

5
处理特定于客户的软件补丁的现实方法是什么?
我正在尝试收集其他人解决以下问题的有效方法。在工作中,我们被迫发布仅希望特定客户看到的软件补丁(安装在最终用户系统上)。定制代码位于其自己的源代码控制分支中。问题是我们有两条并行的代码行(和构建脚本)保持同步,并且每次我们修补原始代码时,我们都必须修补和测试客户特定的代码。 我很好奇,其他组织如何处理这种情况?我们向业务解决方案开放,而不仅仅是技术(与源代码控制相关)解决方案。例如,我们已经讨论过告诉客户他们无法在该分支上接收更新。 我们的分支策略是这样的(基于Visual Studio TFS分支指南,尽管我们正在使用Subversion)

13
如何针对客户的非技术意见抗辩Ruby on Rails?
我的客户是翻译企业所有者,他刚刚告诉我他一直在阅读有关Ruby on Rails的信息,并告诉我“ 那里有更多的PHP专家 ”,“ 似乎社区更喜欢它 ”。作为软件工程师和自由职业者,您会对客户说些什么,以实现这些目标: 卖 让他知道技术是我的专家决定,并且Rails在这个特定项目上比PHP(或其他框架)好或好。 更新:谢谢大家的建议!明天我将再与他见面,让我们看看进展如何,我将再次更新:) 更新2:最后,我告诉他阅读此主题,结果非常棒:他给了我这个项目,我们现在就开始。谢谢大家的帮助,如果有一天,您可以免费喝啤酒:) 顺便说一句:我学到了一个教训:尽可能透明,因为如果您相信自己和您的工作,那么毫无疑问会妥协地击败您。 问候

5
如何使用C#和NUnit构建GUI应用程序的单元测试
我被要求做一个小项目,为我们的一个客户提供一个简单的应用程序。通常,我会在后端代码上工作,在那里我已经解决了所有测试需求,而且我还没有为GUI编写测试的乐趣,因此我不清楚应该如何设置EXE的测试代码和工具。 我的第一个直觉是简单地将测试与应用程序代码一起包含,但是这将需要提供一些特定于测试的依赖项,而我已被指示不要将其交付给客户。我也无法从任何现金中提取现金用于专用测试工具,因此我需要使用手边的工具(StoryQ,RhinoMocks和NUnit),这实际上足以测试一个简单的GUI应用程序的行为。据我所知,这使我不得不在保持设计非常简单或为测试而故意过度设计之间寻求一个良好的平衡。似乎我要么像往常一样在单独的库中构建具有业务逻辑的应用程序并针对该库进行测试,要么找到其他机制使我可以执行该应用程序,而不会破坏应用程序设计所没有的其他模块真的需要。 编辑: 请注意,这个问题是关于如何构造NUnit和我的可执行文件之间的关系(而不是DLL),而不是关于如何分离表示和业务逻辑。 /编辑 所以我的问题是: 是否有特定/推荐的方法来配置带有单元测试的简单GUI应用程序,以使我能够使用手头的工具来充分检查状态和行为,而又无需过度设计? 我是否错过了一些有关测试EXE(而不是DLL)时应调用/配置NUnit的方式的基本知识? 您能否提供或指出我如何实现所有这些目的的示例? 我意识到可能有不止一种方法可以执行此操作,因此我正在根据您的经验寻找具体的实施准则。
16 c#  testing  gui  nunit 

2
带有大型公司通讯,配置管理和测试要求的Mercurial存储库结构
我还是另一个Subversion用户,他在分布式版本控制的Tao中苦苦地对其自身进行重新教育。 使用Subversion时,我非常喜欢次项目方法,并且与大多数以前的雇主一样,我们将构建存储库分支;标签和主干如下: branches-+ +-personal-+ | +-alice-+ | | +-shinyNewFeature | | +-AUTOMATED-+ | | +-shinyNewFeature | +-bob-+ | +-AUTOMATED-+ | +-bespokeCustomerProject +-project-+ +-shinyNewFeature +-fixStinkyBug tags-+ +-m20110401_releaseCandidate_0_1 +-m20110505_release_0_1 +-m20110602_milestone trunk 在实际的源代码树本身中,我们将使用(类似)以下结构: (src)-+ +-developmentAutomation-+ | +-testAutomation | +-deploymentAutomation | +-docGeneration | +-staticAnalysis | +-systemTest | +-performanceMeasurement | +-configurationManagement | +-utilities +-libraries-+ | …

7
您如何跟踪大型项目?
当处理一个包含许多不同文件的项目时,我似乎总是不了解零件之间如何交互。我从来没有真正遇到过孤立地了解较小的组件的问题,但是随着项目的复杂性增加,我发现自己无法从心智上理解正在发生的事情。随着方法和源文件数量的增加,我尤其在OOP项目中注意到这一点。 我的背景:我是一个自学成才的网络程序员。我主要使用python处理快速而肮脏的脚本,但是我也做了一些基本的django项目。我喜欢flask之类的Web框架,因为在单文件布局的简单性中,我可以轻松(大部分)跟踪正在发生的事情。 现在,我处于需要与其他人开发的大型Zend Framework PHP项目进行交互的情况,而试图理解扩展到许多文件的代码让我不知所措。 您发现哪些技术和过程对理解他人开发的大型代码库有用?您是否找到任何特定的图表来帮助您掌握大图?

4
为什么某些站点会阻止密码中的空格?
在较新的网站上似乎不太常见,但是我需要使用多个帐户(例如,用于支付帐单等)的网站阻止我创建带有空格的密码。这只会使事情更加难以记住,而且我知道密码对数据库的空间或编程没有限制,否则会进行加密或(禁止使用天堂符号)。那么,为什么在注册站点时通常会歧视空格键呢?

1
当您真的只是想让事物同步时,如何处理异步函数
我对NodeJS相当陌生,当我真的希望一个调用以同步的方式跟随另一个调用时,我很难理解函数的异步特性。 假设我正在调用Web服务方法。每个方法都有一个回调函数。但是,如果我想按特定顺序调用其中的10个怎么办?我真的需要在第一个回调中链接/嵌入所有功能吗?如果第二次连锁略有不同怎么办? 是否存在任何优雅的模式来应对您确实希望事情保持同步的情况? 还是真的应该让这种编程习惯于另一种思维方式?如果是这样的话,也许有人可以给我指出一个使用回调的较长函数链的清晰示例……
16 node.js 

11
为什么推荐使用Python作为入门级编程语言?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 我在P.SE上阅读了更多问题,建议初学者选择Python作为他们的第一门编程语言。 不要误会我的意思,我喜欢Python。我很喜欢!但是它的哲学围绕着“我们都同意这里的成年人”。 从经验/知识的角度来看,初学者不是成年人。这就意味着即使您在伤口中幸存下来,也更容易朝自己的脚射击并养成一些不良习惯。 我在想,用一种“更静态”的语言,用脚踩枪会比较困难,因为它的限制性更大。 回到我的问题。为什么推荐使用Python作为入门级编程语言? 有哪些优点使其适合教授编程语言。还是...顾问的个人喜好?

4
Bill Gosper说数据结构只是一种愚蠢的编程语言意味着什么?[关闭]
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 小拉尔夫·威廉·高斯珀(Ralph William Gosper)的话说: 数据结构只是一种愚蠢的编程语言。 他是什么意思?las,我在Google上能找到的就是对报价本身的无休止的复制/粘贴,没有任何上下文。

9
如何有效处理大型Linux / makefile项目?
我从事C ++ Windows应用程序开发已有10年了。最近,我开始研究一些Linux项目,我无法忍受如此无用的工作... 我学习速度很快,并且一段时间以来我一直在使用Linux作为主要平台。而且我对shell,OS原理和GUI感到非常满意。但是当涉及到开发时,感觉就像我回到了学校。 一旦我打开一个更大的项目,我就被卡住了。它们中的大多数都是基于makefile的,因此基本上,当我尝试使用QT或CodeBlocks导航它们时,充其量,我可以基于每个文件使用intellisense。而且大多数时间变量都从作用域泄漏。 然后是一个似乎没有定义的东西,尝试从sourceforge加入一些更大的项目,并且您被困了好几天,因为导航到定义是如此困难…… grep -r "this_def" . --include "*.cpp" --include "*.h"似乎太慢而且笨拙。 然后,调试gdb确实可以工作,但是无论我做什么,似乎WinDbg或VisualStudio调试器都落后了光年。 这些事情使我感到绝望,我想编写代码,但是过程太慢了……我开始认为Linux开发人员会心地学习函数定义并通过眼睛来分析代码,但是我不敢相信所以。 有人经历过这个吗?有什么我想念的东西可以使我更有生产力吗?
16 c++  linux 

8
使用C ++但不使用语言的特定功能时,应该切换到C吗?
在业余时间,我正在开发NES模拟器作为一种爱好。我之所以使用C ++,是因为它是我最常使用,最常了解和最喜欢的语言。 但是,既然我在项目中取得了一些进步,我意识到我几乎没有使用C ++的任何特定功能,并且可以在普通C语言中完成并获得相同的结果。我不使用模板,运算符重载,多态性,继承。那你会说什么 我应该留在C ++还是用C重写? 我不会这样做来获得性能,它可能会产生副作用,但是想法是为什么在不需要C ++时为什么要使用C ++? 我正在使用的C ++的唯一功能是用于封装数据和方法的类,但是可以使用结构和函数来完成,我正在使用new和delete,但也可以使用malloc和free,我仅将继承用于回调,这可以通过指向函数的指针来实现。 请记住,这是一个业余项目,我没有截止日期,因此需要重写的开销时间和工作不是问题,也可能很有趣。那么,问题是C还是C ++?
16 c++  c 

7
是否有必要读取每个字节以检查复制的文件是否与原始文件相同?
我最近了解到一个名为Total Commander的程序。它是Windows资源管理器的替代品,具有自己的用于复制文件的内容。为了检查文件是否相同,它不计算CRC,而是逐字检查原始文件和副本上的每个字节。 我的问题是:这必要吗?CRC或任何其他此类技术会出错吗?作为程序员,您是否应该尝试实施这种完善而缓慢的系统,还是过于极端?

1
可以将所有代码表示为一系列Map / Filter / Reduce操作吗?
我最近一直在重构大量代码并将其替换为Linq查询。 消除语言偏见-Linq本质上是一组对一系列数据进行操作的Map / Filter和Reduce操作。 这让我开始思考,从理论上讲,我能走多远。我是否可以将整个代码库重写为一系列(甚至单个)Map / Filter和Reduce操作。 不幸的是,我得到报酬去做有用的事情,所以我无法做进一步的实验,但是我无法想到任何无法重构的代码结构。副作用代码可以通过monad处理。即使输出本质上是将内存地址映射到屏幕地址。 有什么东西(理论上)不能重写为Linq查询吗?

7
如何将代码重构为一些通用代码?
背景 我正在进行中的C#项目。我不是C#程序员,主要不是C ++程序员。因此,我基本上被分配了简单的重构任务。 该代码是一团糟。这是一个巨大的项目。由于我们的客户要求频繁发布具有新功能和错误修复的程序,因此所有其他开发人员在编码时都被迫采取暴力手段。该代码极难维护,所有其他开发人员都同意。 我不是在这里辩论他们是否做对了。在重构时,我想知道我是否以正确的方式进行操作,因为重构后的代码似乎很复杂!这是我作为简单示例的任务。 问题 有六类:A,B,C,D,E和F。所有的类都有一个功能ExecJob()。所有六个实现都非常相似。基本上,起初A::ExecJob()是写的。然后需要一个稍有不同的版本,该版本B::ExecJob()通过对的复制粘贴修改进行实现A::ExecJob()。当需要另一个略有不同的版本时,C::ExecJob()编写此类代码。所有六个实现都有一些通用代码,然后有一些不同的代码行,再有一些通用代码,依此类推。这是实现的一个简单示例: A::ExecJob() { S1; S2; S3; S4; S5; } B::ExecJob() { S1; S3; S4; S5; } C::ExecJob() { S1; S3; S4; } SN一组完全相同的语句在哪里。 为了使它们通用,我创建了另一个类并将通用代码移到函数中。使用参数控制应执行的语句组: Base::CommonTask(param) { S1; if (param.s2) S2; S3; S4; if (param.s5) S5; } A::ExecJob() // A inherits Base { param.s2 = …

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.