软件工程

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

9
为什么比库文件夹更喜欢包管理器?
当我考虑静态库文件夹和程序包管理器的优缺点时,我觉得库文件夹是一种更好的方法。 我看到的带有库文件夹的优点: 无需外部工具即可管理软件包。 无需互联网连接即可构建。 更快的构建(无需软件包检查)。 更简单的环境(所需知识更少)。 我在套件管理员中看到的优点: 帮助处理复杂的依赖关系树(可以通过下载依赖关系及其所有​​依赖关系进行管理)。 帮助检查是否有可用的新版本。 业界似乎已经决定对当今构建的几乎所有产品都遵循包管理器的路径。那么,我想念什么?

7
建立服务层有多重要?
我开始按3层(DAL,BL,UI)构建应用程序[它主要处理CRM,一些销售报告和库存]。 一位同事告诉我,我必须转向服务层模式,开发人员应从他们的经验中学到服务模式,这是设计大多数应用程序的更好方法。他说,将来以这种方式维护应用程序会容易得多。 就个人而言,我觉得它只是使事情变得更加复杂,我看不出有什么好处可以证明这一点。 这个应用程序确实有一个额外的小部分ui,它使用了一些(但只有少数)桌面应用程序功能,因此我确实发现自己在复制一些代码(但不很多)。仅仅由于某些代码重复,我不会将其转换为面向服务的,但是他说我还是应该使用它,因为总的来说,这是一个非常好的架构,为什么程序员如此热衷于服务? 我试图用谷歌搜索它,但是我仍然很困惑,无法决定该怎么做。

7
如果函数必须在执行预期的行为之前执行null检查,这是不好的设计吗?
所以我不知道这是好是坏的代码设计,所以我想我最好问一下。 我经常创建用于处理涉及类的数据的方法,并且经常对方法进行大量检查,以确保事先没有空引用或其他错误。 一个非常基本的例子: // fields and properties private Entity _someEntity; public Entity SomeEntity => _someEntity; public void AssignEntity(Entity entity){ _someEntity = entity; } public void SetName(string name) { if (_someEntity == null) return; //check to avoid null ref _someEntity.Name = name; label.SetText(_someEntity.Name); } 因此,您可以看到im每次都检查null。但是该方法应该没有此检查吗? 例如,外部代码应事先清除数据,这样方法就不需要进行如下验证: if(entity != null) // this …
67 c#  design  validation 

16
当TDD没有帮助时,如何避免代码中的逻辑错误?
最近,我正在编写一小段代码,以人类友好的方式指示事件的年代。例如,它可能表明该事件发生在“三周前”或“一个月前”或“昨天”。 需求相对明确,这是测试驱动开发的完美案例。我一个接一个地编写了测试,实现了通过每个测试的代码,一切似乎都正常运行。直到生产中出现错误为止。 这是相关的代码段: now = datetime.datetime.utcnow() today = now.date() if event_date.date() == today: return "Today" yesterday = today - datetime.timedelta(1) if event_date.date() == yesterday: return "Yesterday" delta = (now - event_date).days if delta < 7: return _number_to_text(delta) + " days ago" if delta < 30: weeks = math.floor(delta / 7) …

10
现代Web应用程序框架如何以及为什么演变为将URL路由与文件系统分离?
与大约10年前相比,我已经注意到使用路由样式将URL路径与文件系统分离的框架向框架的转变。这通常是在前控制器模式的帮助下完成的。 即,以前,URL路径直接映射到文件系统,因此反映了磁盘上的确切文件和文件夹,如今,实际的URL路径已编程为通过配置定向到特定的类,因此不再反映文件系统文件夹和文件结构。 题 这如何以及为什么变得司空见惯?它如何以及为什么决定将其“更好”到有效地摒弃了曾经司空见惯的直接归档方法? 其他答案 这里有一个类似的答案,有点涉及路由的概念以及一些优点和缺点:对于PHP框架,为什么要使用“路由”概念? 但是,它没有解决历史变化方面的问题,也没有解决这种变化如何或为什么逐渐发生的问题,到如今使用这种新的路由样式模式的新项目几乎都在哪里,而直接归档已经过时或被放弃了。 同样,提到的大多数优缺点似乎不足以保证进行这样的全球变更。我能看到推动这一变化的唯一好处也许是向最终用户隐藏了文件/文件夹系统,并且缺少?param=value&param2=value,这使得URL看起来有点干净。但是,这些是改变的唯一原因吗?如果是,为什么背后有这些原因? 例子: 我最熟悉PHP框架,许多流行的现代框架都使用这种分离的路由方法。为了使其正常工作,您可以在Apache或类似的Web服务器中设置URL重写,在该URL中,通常不再通过直接指向文件的URL路径触发Web应用程序功能。 Zend表现力 https://docs.zendframework.com/zend-expressive/features/router/aura/ https://docs.zendframework.com/zend-expressive/features/router/fast-route/ https://docs.zendframework。 com / zend-expressive / features / router / zf2 / Zend框架 https://docs.zendframework.com/zend-mvc/routing/ 拉拉韦尔 https://laravel.com/docs/5.5/routing CakePHP https://book.cakephp.org/3.0/en/development/routing.html

10
向下转换的正确用法是什么?
向下转换意味着从基类(或接口)转换为子类或叶类。 如果您从转换System.Object为其他类型,则可能会导致沮丧。 向下转换不受欢迎,可能有代码味道:例如,面向对象的理论更喜欢定义和调用虚拟或抽象方法,而不是向下转换。 什么是向下转换的好用例(如果有)?也就是说,在什么情况下编写向下转换的代码是合适的? 如果您的答案为“无”,那么为什么该语言支持向下转换?

10
当与“ if”和“ while”一起使用时,为什么语言需要在表达式周围加上括号?
如C,Java中,和C ++语言在使用时都需要围绕整个表达式括号if,while或switch。 if (true) { // Do something } 相对于 if true { // Do something } 我觉得这很奇怪,因为括号是多余的。在此示例中,true是一个单独的表达式。括号不会以我所知的任何方式改变其含义。为什么存在这种奇怪的语法?为什么如此常见?我不知道有什么好处吗?

9
90/10程序优化规则的含义是什么?
根据Wikipedia的介绍,程序优化的90/10规则指出:“程序执行时间的90%用于执行10%的代码”(请参见此处的第二段)。 我真的不明白。这到底是什么意思?如何仅在执行10%的代码上花费90%的执行时间?那么其余90%的代码呢?如何仅在10%的时间内执行它们?

7
您如何将程序从开发中过渡到发布?
在某个时候,正在开发一个程序。一直在添加,删除或更改功能。每个版本都不过是一个原型。因此,此时我不会在编写超级干净的代码上浪费太多时间,因为我永远不知道事情持续多长时间。当然,我尝试将代码质量保持在某些标准上,但是时间始终是一个问题。 然后是程序完成的时刻,决策者说“就是这样”。此时我确实有一个可以正常工作的原型,但是在开发阶段,所有来回的代码都有些混乱。我应该开始测试/最终调试,但是我的直觉告诉我,现在应该以某种方式清理和/或重写内容,以提供使其易于维护等的适当体系结构。 一旦对材料进行了测试和批准,则没有必要进行重写。我经常站在那儿,工作着一个“完成的”原型,在测试过程中发现一个错误,我发现这是整个开发过程中非智能编码的结果。我正在测试中,错误修正将是一个重写……真是一团糟! 我敢肯定,有更好的/教科书方式。但是我必须在一个真正的工作环境中工作,而不是一切都是教科书。 那么,如何将工作原型转换为具有稳定代码库的发行版本?也许我不应该认为开发一旦完成就将其视为清理阶段……我不知道,我需要帮助。 编辑 我想澄清一些事情。 我100%愿意在此之前和之后都这样做,代码清晰易读。但是我也必须把事情做好,并且不能梦想代码干净整洁的美丽。我必须找到一个折衷方案。 通常,一项新功能实际上只是我们要尝试的东西,看看实现这样的事情是否有意义。(尤其是在移动应用中,是为了在实际设备上获得真实的外观)。因此(imho)在第一次“让我们看看”迭代中并不能证明过多的工作是不小的。但是有时会出现问题,我何时支付此技术债务?这就是这个问题的全部内容。 如果我知道一半的功能将在一天后被删除(到现在为止我们公司已有足够的经验),我真的很难相信解决我的问题的最佳方法是仍然投入额外的时间来编写所有干净的东西,即使大部分将在不久后删除。对我来说,如果事情一发不可收拾,我进行一次大的清理,我会节省时间,因此是我的问题。

7
为什么有这么多项目更喜欢“ git rebase”而不是“ git merge”?
使用DVCS的优点之一是编辑提交合并工作流(通常由CVCS强制执行的编辑合并提交工作)。允许将每个唯一更改记录在与合并无关的存储库中,可确保DAG准确反映项目的真实血统书。 为什么这么多网站谈论要“避免合并提交”?合并合并前合并或合并后合并是否会使隔离回归,还原过去的更改等变得更加困难? 澄清点: DVCS的默认行为是创建合并提交。为什么有那么多地方谈论看到隐藏这些合并提交的线性开发历史的愿望?

8
如果我需要在程序的整个生命周期中使用一块内存,是否真的有必要在程序终止之前释放它?
在许多书籍和教程中,我都听说过内存管理的做法很受压力,并感到如果使用完内存后不释放内存,将会发生一些神秘而可怕的事情。 我无法代表其他系统(尽管对我而言,可以假设它们采用了类似的做法是合理的),但是至少在Windows上,内核可以保证清除由以下系统使用的大部分资源(少数情况除外)程序终止后的程序。其中包括堆内存等。 我了解为什么您要在使用完文件后关闭文件以使文件可供用户使用,或者为什么要断开连接到服务器的套接字以节省带宽,但是这样做似乎很愚蠢。必须微管理程序使用的所有内存。 现在,我同意这个问题是广泛的,因为您应该如何处理内存取决于您需要多少内存以及何时需要,因此我将把这个问题的范围缩小到这个范围:如果我需要使用在程序整个生命周期中的内存,在程序终止之前是否真的有必要释放它? 编辑:建议作为重复的问题是特定于Unix家族的操作系统。它的最高答案甚至指定了特定于Linux的工具(例如Valgrind)。该问题旨在涵盖大多数“常规”非嵌入式操作系统,以及为什么在程序的整个生命周期内释放所需的内存是一个好习惯,或不是一个好习惯。


10
仅仅为了解决非关键性的错字就值得做出承诺吗?
如果我在代码中遇到了非关键性的拼写错误(例如,print(error)语句中出现了错误的撇号),是否值得做出承诺来解决该错误,还是应该将其单独放置? 具体来说,我很好奇如何权衡提交日志的解决方案与解决这些非关键错别字的价值。我倾向于解决它们。我是在学脚吗?

9
在什么时候可以说我已经“学习”了一种语言?
在我的几年编程中,我玩弄了从Ruby到C ++的所有内容。从学习基本语法(Ruby)到完成一些扩展我的语言能力的重大(对我而言)项目,我已经做了很多工作。考虑到这种多样性(以及真正学习语言永不停止的事实),我什么时候可以说我知道(或已经学习)一种语言?

16
程序员在选择语言和框架时应有多少自由度?
我开始在一家主要面向C#的公司工作。我们有些人喜欢Java和JRuby,但是这里的大多数程序员都喜欢C#。我之所以被录用,是因为我有很多构建Web应用程序的经验,并且因为我倾向于JRuby on Rails或nodejs等较新的技术。 我最近开始了一个构建Web应用程序的项目,该项目的重点是在短时间内完成很多工作。软件负责人指示我使用mvc4而不是rails。可能还可以,除了我不知道mvc4,我不懂C#,而且我是唯一负责创建Web应用程序服务器和前端UI的人。 使用我已经非常了解的框架(Rails)而不是使用mvc4有意义吗?该决定背后的原因是,技术负责人不了解Jruby / rails,因此无法重用代码。 相反的论点: 他不会为代码做贡献,坦率地说, 这个项目不需要他。因此,他是否知道JRuby / rails并不重要。 实际上,我们可以重用代码,因为我们有很多Java应用程序,JRuby可以从中提取代码,反之亦然。实际上,他已经投入了一些资源将Java库转换为C#,而不仅仅是在JRuby on Rails应用程序上运行Java库。都是因为他不喜欢Java或JRuby 我已经构建了许多Web应用程序,但是使用一些陌生的东西会引起一些混乱,而我却无法像过去那样在短时间内构建出色的应用程序。这样很好 学习新技术在这一领域很重要。问题是,对于这个项目,我们需要快速完成很多工作。 在什么时候应该允许开发人员选择其工具?这取决于公司吗?我的公司吮吸或认为这正常吗?是否存在绿色牧场?我看错了方向吗?

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.