软件工程

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

5
在Java中,即使不必使用“ final”作为参数和局部变量也应如此吗?
Java允许将变量(字段/局部变量/参数)标记为final,以防止重新分配到变量中。我发现它对于字段非常有用,因为它可以帮助我快速查看某些属性(或整个类)是否是不可变的。 另一方面,我发现它对局部变量和参数的用处不大,通常我避免将它们标记为final即使它们永远都不会被重新分配(明显的例外,当它们需要在内部类中使用时) 。但是,最近,我遇到了最终可用的代码,我想从技术上讲,它可以提供更多信息。 不再对我的编程风格充满信心,我想知道在final任何地方应用的其他优点和缺点是什么,最常见的行业风格是什么,为什么。
105 java  coding-style  final 

12
如果我们重写SetWidth和SetHeight方法,为什么Square从Rectangle继承会出现问题?
如果Square是Rectangle的一种类型,那么为什么Square无法从Rectangle继承?还是为什么设计不好? 我听说有人说: 如果您使Square从Rectangle派生,那么Square应该可以在您期望矩形的任何地方使用 这里有什么问题?为何Square可以在您期望矩形的任何地方使用?仅当我们创建Square对象,并且重写Square的SetWidth和SetHeight方法时,它才可用,为什么会有任何问题呢? 如果您在Rectangle基类上具有SetWidth和SetHeight方法,并且Rectangle引用指向一个Square,则SetWidth和SetHeight毫无意义,因为设置一个将更改另一个以匹配它。在这种情况下,Square无法通过带有矩形的Liskov替代测试,并且从Square继承Square的抽象是一个不好的选择。 有人可以解释以上论点吗?同样,如果我们在Square中重写SetWidth和SetHeight方法,它是否可以解决此问题? 我也听说过: 真正的问题是我们不是在建模矩形,而是在“舒适的矩​​形”上建模,即在创建后可以修改宽度或高度的矩形(并且我们仍然将其视为同一对象)。如果我们以这种方式看待矩形类,很明显,正方形不是“可接受的矩形”,因为正方形无法重塑,并且仍然是正方形(通常)。在数学上,我们看不到问题,因为在数学环境中可变性甚至都没有意义 在这里,我认为“可调整大小”是正确的术语。矩形是“可调整大小的”,正方形也是如此。我在上述论点中缺少什么吗?可以像调整任何矩形一样调整正方形的大小。

22
自动编程:编写可编写代码的代码
读完《实用程序员》一书后,我发现最有趣的论点之一是“编写代码编写代码”。 我尝试在网上搜索更多有关它的解释或文章,尽管我找到了一些有关该主题的不错的文章,但仍然没有找到任何特定的代码实现或好的示例。 我觉得它仍然不是一个普遍的论点,缺乏文档或者很多人不接受,我想对此有所了解。 您如何看待这个主题?它会真正提高您的生产力吗?在书籍,博客,幻灯片等中,关于该主题有哪些好的资源? 一些代码示例将不胜感激,使我可以更好地理解其实现。 这是有关该主题的Wiki页面,其中包含各种相关的编程技术,例如元编程,生成式编程和代码生成。



5
转向微服务如何造成运行时问题?
以下评论员写道: 微服务将组织功能障碍从编译时问题转移到运行时问题。 该评论员扩展了该问题的说法: 功能不是错误。运行时问题=>产品问题=>向功能负责人反馈更强大,更快速的功能障碍 现在,我通过微服务获得了您: 可能会增加吞吐量的延迟-这是生产和运行时的问题。 增加代码中“网络接口”的数量,其中可能存在潜在的运行时解析错误。 可能会进行蓝绿色部署。接口不匹配可能会阻止这些故障(请参阅网络接口)。但是,如果蓝绿色部署能够正常工作,那么它就更是运行时的问题。 我的问题是:转移到微服务会带来运行时问题,这是什么意思?

3
蹦床为什么起作用?
我一直在做一些功能性JavaScript。我以为已经实现了尾叫优化,但是事实证明我错了。因此,我不得不自学流浪汉。在这里和其他地方稍作阅读后,我便掌握了基础知识并构造了我的第一个蹦床: /*not the fanciest, it's just meant to reenforce that I know what I'm doing.*/ function loopy(x){ if (x<10000000){ return function(){ return loopy(x+1) } }else{ return x; } }; function trampoline(foo){ while(foo && typeof foo === 'function'){ foo = foo(); } return foo; /*I've seen trampolines without this, mine wouldn't …

3
REST API安全性存储令牌vs JWT vs OAuth
我仍在尝试寻找最佳的安全解决方案来保护REST API,因为移动应用程序和API的数量每天都在增加。 我尝试了不同的身份验证方式,但是仍然存在一些误解,因此我需要经验丰富的人的建议。 让我说说,我如何理解所有这些东西。如果我理解不正确,请告诉我。 就REST API和WEB而言,它都是无状态的,我们需要在每个请求中发送一些auth数据(cookie,令牌...)。我知道三种用于验证用户身份的广泛使用的机制 使用HTTPS的令牌。我已经使用这种方法很多次,对于HTTPS来说已经足够了。如果用户提供正确的密码和登录名,他将收到令牌作为响应,并将其用于其他请求。令牌由服务器生成并存储,例如存储在单独的表中或存储用户信息的表中。因此,对于每个请求服务器,检查用户是否具有令牌,并且该令牌与数据库中的令牌相同。一切都非常简单。 JWT令牌。该令牌是自描述的,它包含有关令牌本身的所有必要信息,用户无法更改(例如到期日期)或任何其他声明,因为该令牌是由服务器使用secret关键字生成(签名)的。这也很清楚。但是对我个人来说,一个大问题是如何使令牌无效。 OAuth2。我不明白为什么直接在服务器和客户端之间建立通信时应使用这种方法。据我了解,OAuth服务器用于发布具有受限范围的令牌,以允许其他应用程序访问用户信息而无需存储密码和登录名。对于社交网络而言,这是一个很好的解决方案,当用户想要在某个页面上进行注册时,服务器可以请求权限以获取用户信息(例如,从Twitter或Facebook获取信息),并使用用户数据等填充注册字段。 考虑将移动客户端用于在线商店。 第一个问题,我应该比第一类令牌更喜欢JWT吗?就我需要在移动客户端上登录/注销用户而言,我需要将令牌存储在某个地方,或者在JWT的情况下,令牌应该在注销时失效。使用不同的方法来使令牌无效,其中之一是创建无效的令牌列表(黑名单)。嗯 表/文件的大小比令牌存储在表中并与用户相关联并且在注销时被删除时要大得多。 那么,JWT令牌的好处是什么? 关于OAuth的第二个问题,如果与服务器直接通信,应该使用它吗?客户端和服务器之间仅发出令牌的另一层的目的是什么,但是通信将不是与oauth服务器,而是与主服务器。据我了解,OAuth服务器仅负责授予第三方应用访问用户私人信息的权限(令牌)。但是我的移动客户端应用程序不是第三方。
104 security  rest  api  oauth  https 

10
如何使大型代码库更容易理解
假设我正在开发一个相对较大的项目。我已经用Doxygen记录了我的所有类和函数,但是,我有个主意,在每个源代码文件上都写上“程序员笔记”。 这背后的想法是用通俗的术语解释一个特定的类是如何工作的(不仅是为什么大多数评论如此)。换句话说,让其他程序员对类的工作方式有另一种看法。 例如: /* * PROGRAMMER'S NOTES: * * As stated in the documentation, the GamepadManager class * reads joystick joystick input using SDL and 'parses' SDL events to * Qt signals. * * Most of the code here is about goofing around the joystick mappings. * We want to …


14
TDD是否会使防御性编程变得多余?
今天,我与一位同事进行了有趣的讨论。 我是一名防御性程序员。我认为必须始终遵循“ 类必须确保其对象在从类外部进行交互时具有有效状态 ”的规则。该规则的原因是该类不知道其用户是谁,并且在以非法方式与之交互时,它应该可以预见地失败。我认为该规则适用于所有阶层。 在今天我进行讨论的特定情况下,我编写了代码来验证构造函数的参数正确(例如,整数参数必须大于0),并且如果不满足前提条件,则会引发异常。另一方面,我的同事认为这种检查是多余的,因为单元测试应该捕获该类的任何不正确使用。此外,他认为防御性编程验证也应该进行单元测试,因此防御性编程会增加很多工作,因此对于TDD并不是最佳的。 TDD是否能够取代防御性编程,这是真的吗?结果是否不需要参数验证(并不是我的意思是用户输入)?还是两种技术相辅相成?

5
C#中异步/等待用法的准则是否与好的架构和抽象分层的概念相矛盾?
这个问题与C#语言有关,但我希望它涵盖其他语言,例如Java或TypeScript。 Microsoft建议在.NET中使用异步调用的最佳做法。在这些建议中,让我们选择两个: 更改异步方法的签名,以便它们返回Task或Task <>(在TypeScript中,这将是Promise <>) 更改异步方法的名称以xxxAsync()结尾 现在,当用异步组件替换低级同步组件时,这会影响应用程序的整个堆栈。由于异步/等待仅在“一直使用”时才有积极影响,因此这意味着必须更改应用程序中每一层的签名和方法名称。 好的体系结构通常涉及在每个层之间放置抽象,这样高层组件就看不到用其他组件替换低层组件。在C#中,抽象采用接口的形式。如果我们引入了一个新的,低级的异步组件,则调用堆栈中的每个接口都需要修改或替换为一个新接口。在实现类中解决问题(异步或同步)的方式不再对调用方隐藏(抽象)。调用者必须知道它是同步还是异步。 异步/等待与“良好架构”原则相抵触的最佳做法吗? 这是否意味着每个接口(例如IEnumerable,IDataAccessLayer)都需要它们的异步对应项(IAsyncEnumerable,IAsyncDataAccessLayer),以便在切换到异步依赖项时可以在堆栈中对其进行替换? 如果我们进一步推论这个问题,那么假设每个方法都是异步的(返回Task <>或Promise <>),并且使方法在实际上不是实际的情况下同步,会不会更简单?异步?这是将来的编程语言所期望的吗?
103 c#  architecture  async 

4
“ lib”文件夹和“ vendor”文件夹之间有什么区别?
对于源文件夹层次中,总有一些共同的特点,比如src,doc或test文件夹,其中有相当容易理解的内容。 但是,我意识到大型项目同时具有lib和vendor文件夹,而我一直认为它们是相同的,因为它们的名称暗示包括“ libraries来自外部的第三方vendors”。虽然,无论是在同一个项目中看到意味着是一个区别。 我找不到任何信息,也找不到关于Google的信息,也找不到诸如Filesystem Hierarchy Standard之类的资源,尽管这实际上是一种普遍的做法。 这是Symfony的一个更详细的示例:创建项目后,您将lib在项目的根目录获得一个文件夹。在此文件夹中,找到以下结构: lib +--filter +--form +--… +--vendor +--simpletest +--symfony 在此,symfony文件夹包含了所有Symfony的核心。

14
如何真正掌握编程语言?
我知道学习语言,您只需购买一本书,按照示例操作,并尽可能尝试练习。但是,我真正要寻找的是一旦学习了该语言,该如何掌握它。 现在我知道经验是一个主要因素,但是学习语言的内部知识,底层结构是什么等等。 那里有文章说读这本书,读那本书,做这个游戏以及那个游戏。但是对我来说,这并不意味着要精通一门语言。我希望能够阅读别人的代码并理解它,无论这样做有多困难。了解何时使用功能以及何时使用其他功能等。 名单可以继续下去,但我相信我已经指出了。:) 最后,如果需要,可以使用任何语言作为示例,尽管最好以C作为示例。

12
可测试的代码更好吗?
我试图养成定期用我的代码编写单元测试的习惯,但是我已经读过第一件事,编写可测试的代码很重要。 这个问题涉及编写可测试代码的SOLID原则,但是我想知道这些设计原则是否有益(或至少无害),而根本不计划编写测试。需要澄清的是-我了解编写测试的重要性;这不是它们有用性的问题。 为了说明我的困惑,在启发这个问题的那篇文章中,作者给出了一个检查当前时间并根据时间返回一些值的函数示例。作者指出这是错误的代码,因为它会产生内部使用的数据(时间),因此很难进行测试。但是,对我而言,将时间作为争论似乎有点过头了。在某个时候需要初始化值,为什么不最接近消耗量呢?另外,在我看来,该方法的目的是基于当前时间返回一些值,通过将其设为参数,您可以暗示可以/应该更改此目的。这个问题以及其他问题使我想知道可测试的代码是否与“更好的”代码同义。 即使在没有测试的情况下,编写可测试的代码是否仍然是一种好习惯? 可测试的代码实际上更稳定吗?建议重复。但是,这个问题与代码的“稳定性”有关,但是我在更广泛地询问代码是否由于其他原因(例如可读性,性能,耦合性等)是否优越。

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.