软件工程

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

4
那么,“艾伦·凯”这个真正的“面向对象”是什么意思?
据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他所说的话,今天我们所说的面向对象不是他的意思。 例如,我刚刚在Google上找到了这个: 我用“面向对象”这个词来形容,我可以告诉你我没有C ++ -艾伦·凯(Alan Kay),OOPSLA '97 我依稀记得听到一些非常有见地的关于他没有意思。类似于“消息传递”的东西。 你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。 谢谢。


18
依赖注入:如何出售
众所周知,我是依赖注入(DI)和自动化测试的忠实拥护者。我可以整天谈论它。 背景 最近,我们的团队刚刚获得了一个从头开始构建的大型项目。它是具有复杂业务需求的战略应用程序。当然,我希望它美观大方,对我而言意味着:可维护且可测试。所以我想使用DI。 抵抗性 问题出在我们的团队中,DI是禁忌。它被提出了几次,但是众神不赞成。但这并没有阻止我。 我的举动 这听起来可能很奇怪,但是第三方库通常不经我们的架构师团队批准(请考虑:“您不要谈论Unity,Ninject,NHibernate,Moq或NUnit,以免割伤您的手指”)。因此,我没有使用已建立的DI容器,而是编写了一个非常简单的容器。基本上,它在启动时连接了所有依赖项,注入了任何依赖项(构造函数/属性),并在Web请求结束时处置了所有可抛弃对象。它非常轻巧,可以满足我们的需求。然后我请他们进行审查。 响应 好吧,简而言之。我遭到了沉重的抵抗。主要论点是:“我们不需要在已经很复杂的项目中增加这种复杂性”。另外,“这不像我们将插入组件的不同实现”。而且,“我们希望保持简单,如果可能的话,只需将所有内容装入一个程序集。DI是一种无用的复杂性,没有任何好处”。 最后,我的问题 您将如何处理我的情况?我不能很好地表达自己的想法,我想知道人们将如何表达自己的观点。 当然,我假设像我一样,您更喜欢使用DI。如果您不同意,请说出原因,以便我能看到硬币的另一面。看到不同意的人的观点真的很有趣。 更新资料 谢谢大家的回答。它确实使事情成为现实。拥有另一双眼睛可以给您反馈非常好,十五岁的确很棒!这确实是一个很好的答案,可以帮助我从不同角度看待这个问题,但是我只能选择一个答案,所以我只选择投票率最高的一个。感谢大家花时间回答。 我认为现在可能不是实施DI的最佳时机,我们还没有做好准备。相反,我将致力于使设计可测试,并尝试提出自动化的单元测试。我知道编写测试是额外的开销,并且如果曾经确定额外的开销不值得,我个人仍然认为这是一个成功的情况,因为设计仍然可以测试。而且,如果将来进行测试或DI是一种选择,则设计可以轻松应对。


9
在关系数据库中使用列表可以吗?
我一直在尝试设计一个与项目概念相适应的数据库,并遇到了一个似乎引起激烈争论的问题。我已经阅读了几篇文章和一些Stack Overflow的答案,指出永远(或几乎永远)无法在字段中存储ID或类似内容的列表-所有数据都应该是相关的,等等。 不过,我遇到的问题是我正在尝试创建任务分配器。人们将创建任务,将其分配给多个人,并将其保存到数据库中。 当然,如果我将这些任务分别保存在“人员”中,则必须有几十个虚拟的“任务ID”列并对其进行微管理,因为可以将0到100个任务分配给一个人。 再一次,如果我将任务保存在“任务”表中,则必须有几十个虚拟的“ PersonID”列并对其进行微管理-与以前一样的问题。 对于这样的问题,是否可以保存采用一种形式或另一种形式的ID列表,或者我只是不考虑另一种可以在不违反原则的情况下实现的方式?

1
回调和Promises之间真的有根本的区别吗?
在执行单线程异步编程时,我熟悉两种主要技术。最常见的一种是使用回调。这意味着将传递给异步操作的函数的回调函数作为参数。当异步操作完成时,将调用回调。 jQuery这样设计一些典型的代码: $.get('userDetails', {'name': 'joe'}, function(data) { $('#userAge').text(data.age); }); 但是,当我们要在前一个完成后一个接一个地进行其他异步调用时,这种类型的代码可能会变得混乱且高度嵌套。 因此,第二种方法是使用Promises。Promise是一个对象,它表示可能不存在的值。您可以在其上设置回调,当准备读取值时将调用该回调。 Promises和传统的回调方法之间的区别在于,异步方法现在可以同步返回Promise对象,客户端将在其上设置回调。例如,在AngularJS中使用Promises的类似代码: $http.get('userDetails', {'name': 'joe'}) .then(function(response) { $('#userAge').text(response.age); }); 所以我的问题是:实际上有真正的区别吗?区别似乎纯粹是语法上的。 是否有更深层次的理由使用一种技术而不是另一种技术?

12
是否应该使用提交历史记录将关键信息传达给开发人员?
在有关从最新版本回滚第三方SDK的会议中,我们注意到开发人员已经在提交历史记录中标记了不应使用最新版本。 一些开发人员认为这是一种不好的做法,应该在源文件(即// Don't upgrade SDK Version x.y.z, see ticket 1234)或项目级别的README文件中进行注明。其他人则认为,由于提交历史记录是项目文档的一部分,因此对于此类信息而言,它是可接受的位置,因为无论如何我们都应该阅读它。 应该使用提交历史记录将关键信息传达给其他开发人员,还是应该将这些信息复制到其他位置(例如项目README或相关源文件中的注释)?

10
是否有人可以挑战鲍勃叔叔,因为他喜欢移除“无用的牙套”?
我讨厌引用付费墙内容,但是这段视频恰好显示了我在说什么。恰好在罗伯特·马丁(Robert Martin)的12分钟内看了一下: 并说“我最喜欢做的一件事情就是摆脱无用的牙套”,因为他将其变成了这样: 很久以前,在遥远的教育中,我被教导不要这样做,因为它可以通过添加另一条缩进的行以使其很容易引入错误,认为该错误是由if不受时间控制的。 为了公平起见,鲍勃叔叔(Bob)将他的Java长方法重构为微小的小函数,我同意这些小函数的可读性要高得多。当他完成更改后,(22.18)看起来像这样: 我想知道是否应该验证删除括号。我已经熟悉了最佳实践。鲍勃叔叔可以在这一点上受到挑战吗?鲍勃叔叔捍卫了这个主意吗?

10
OOP中的零行为对象-我的设计难题
OOP背后的基本思想是数据和行为(基于数据)是不可分割的,并且它们与类对象的思想联系在一起。对象具有与之配合使用的数据和方法(以及其他数据)。显然,根据OOP的原理,仅仅是数据的对象(如C结构)被视为反模式。 到现在为止还挺好。 问题是我注意到我的代码最近朝着这种反模式的方向发展。在我看来,我越努力实现隐藏在类与松散耦合设计之间的信息,我的类就越成为纯数据无行为类和所有行为无数据类的混合。 我通常以一种使类对其他类的存在的意识最小化并且对其他类的接口的知识最小化的方式设计类。我特别以自上而下的方式执行此操作,较低级别的类不了解较高级别的类。例如: 假设您有一个通用的纸牌游戏API。你上课了Card。现在,该Card课程需要确定玩家的可见度。 一种方法是有boolean isVisible(Player p)对Card类。 另一种是有boolean isVisible(Card c)对Player类。 我特别不喜欢第一种方法,因为它将有关较高级别的知识授予Player较低级别的知识Card。 取而代之的是,我选择了第三个选项,在该选项中,我们有一个Viewport类,给定一个,Player并且卡片列表确定了哪些卡片是可见的。 然而这种做法剥夺了两个Card和Player一个可能的成员函数的类。一旦完成了除卡片可见性之外的其他工作,就剩下了Card和Player类,它们仅包含数据,因为所有功能都是在其他类中实现的,这些类大多是没有数据的类,只是Viewport上面的方法。 这显然与OOP的主要思想背道而驰。 哪种方法正确?我应该如何进行最小化类相互依赖性和最小化假定的知识和耦合的任务,而又不会陷入怪异的设计中,其中所有低层类仅包含数据,而高层类包含所有方法?是否有人对类设计有任何第三种解决方案或观点可以避免整个问题? PS这是另一个例子: 假设您的类DocumentId是不可变的,只有一个BigDecimal id成员和该成员的吸气剂。现在,您需要在某处有一个方法,该方法会从数据库中获得该ID 的DocumentId返回值Document。 你呢: Document getDocument(SqlSession)在DocumentId类中添加方法,突然介绍有关您的persistence("we're using a database and this query is used to retrieve document by id"),用于访问数据库的API等知识。现在,此类也需要持久性JAR文件才能进行编译。 使用method添加其他类Document getDocument(DocumentId id),将DocumentId类保持为无效,无行为,类似于结构的类。

16
为什么用户定义的运算符不更常见?
我从功能语言中错过的一个特性是,运算符只是函数,因此添加自定义运算符通常与添加函数一样简单。许多过程语言都允许运算符重载,因此从某种意义上说,运算符仍然是函数(在D中,该运算符在模板参数中作为字符串传递,这是非常正确的)。 似乎在允许运算符重载的地方,添加额外的自定义运算符通常很简单。我找到了这篇博客文章,该文章认为由于优先级规则,自定义运算符不能很好地使用后缀表示法,但是作者为该问题提供了几种解决方案。 我环顾四周,找不到支持该语言中的自定义运算符的任何过程语言。有一些技巧(例如C ++中的宏),但这与语言支持几乎不一样。 由于此功能实施起来很简单,为什么它不更常见? 我知道这可能会导致某些丑陋的代码,但是这并没有阻止语言设计人员过去添加易于使用的有用功能(宏,三元运算符,不安全的指针)。 实际用例: 实现缺少的运算符(例如,Lua没有按位运算符) 模拟D ~(数组串联) DSL 使用|如UNIX管道风格的语法糖(使用协程/发电机) 我对确实允许自定义运算符的语言也很感兴趣,但是我对为什么它被排除在外更感兴趣。我曾考虑过分叉一种脚本语言来添加用户定义的运算符,但是当我意识到自己没在任何地方看到它时就停下来了,所以可能有充分的理由为什么比我更聪明的语言设计师不允许这样做。


14
向后学习编程,或者“所以我未通过FizzBu​​zz测试。现在呢?” [关闭]
一点背景 我今天28岁,我从未接受过软件开发方面的任何正式培训,但是我确实有两个高等教育学历,分别是公共关系学士学位和专注于项目管理的行政MBA。我已经在这些领域工作了大约6年,而在2.5年前,我辞去了工作/辞掉工作并决定转移方向。 经过一个月的思考,我决定开始自由招募以WordPress开发小型网站。我自学了学习它的方式,今天我可以说我在为自己的客户从头开始开发主题和插件方面做得很谦虚但成功的职业-多数是代理商将他们的一些开发工作外包给大中型网站。 但是有时候我只是觉得我没有学习足够的数学,或者对事情没有一个正式的了解,这确实使我落后于当我不得不与更有经验的开发人员竞争或合作时。我一直在寻找更多学习的方法,但是我似乎缺乏基础知识。 不幸的是,现在不能再花4年的时间来学习计算机科学,所以我正在尝试从书籍和在线资源中学习所有知识。这种方法永远不会让NASA雇用我,但我现在真的不在乎。我的目标是首先通过认证,并能够称自己为真正的程序员。 我目前正在业余时间学习Java for Programmers(掌握每个人都说的困难/要求的语言),阅读Code Complete的摘录(掌握最佳实践)以及Code:计算机的隐藏语言硬件和软件(掌握计算机的内部工作原理)。 TL; DR 所以,我目前的情况是这样的:我基本上能够用PHP编写任何完整的系统(借助于Google和几本书),集成Ajax,SQL和诸如此类的东西,而且可能比有经验的开发人员所期望的要慢一些由于所有的研究。 但是昨天我被困于试图为FizzBu​​zz测试找到一个解决方案(不是Google),因为我没有记住模数运算符的if($n1 % $n2 == 0) 方法 。 您会提出什么建议来解决这个难题?我应该学习哪些主题/书,以更快,甚至更多地“以程序员的方式” 解决问题? 编辑 -似乎对我不知道的解决FizzBu​​zz感到有些困惑。 也许我没有表达自己的意思:我知道解决问题所需的步骤。我没有记住的是模运算符。问题在于将基本数学转换为程序,而不是了解基本数学。 在阅读有关Coding Horror的文章后,我很有趣地参加了测试。我只是认为这是我与经过正式培训的开发人员之间的良好基础比较。 我只是以此为例说明了如何在计算机环境中不处理数学,然后才让我浪费时间查找诸如模运算符之类的基本知识,从而能够解决简单的问题。
94 skills 

7
这些高级软件工程师职称之间有什么区别?[关闭]
我目前是一家大型公司的高级研究软件工程师,在其他地方也可以担任“高级人员工程师”职位。我不确定新职位的头衔是横向变动还是晋升。 因此,在所有其他条件大致相同的情况下(薪水,专业知识等),这些软件工程师职称之间的外部区别是什么(通常,并且与任何特定的公司无关,如果可能的话): 高级工程师 高级研究工程师 高级工程师 技术人员 首席工程师 编辑:让我详细介绍“技术人员”,因为这种情况很少见。我认为这是一个很高的称号,通常与研究相关。我知道Oracle,VMWare和旧的贝尔实验室都拥有这些头衔。请参阅:技术人员。我知道这是什么意思,但我不知道它与其他书名是如何叠加的,这就是我问的原因。

16
TDD负面经验[关闭]
您的TDD体验的不利方面是什么?您是否发现婴儿脚步(使测试呈绿色的最简单方法)烦人且无用?您是否发现无价值测试(当测试最初具有意义但最终实现时会检查与其他测试相同的逻辑)维护的重要性吗?等等 上面的问题是我在TDD体验期间感到不舒服的事情。因此,我很感兴趣其他开发人员是否有类似的感受,以及他们如何看待它们。 感谢描述TDD负面方面的文章链接(Google充斥着正面且经常是狂热的文章)。
94 tdd 

27
人们为什么使用编程书籍?[关闭]
我发现,当有人问什么是学习编程的最佳方法时,人们通常会向他们提供由不同作者撰写的一堆文本的参考。 但是我不相信有很多人会从书籍中学习编程。我发现他们通常面临挑战,然后使用编程作为克服挑战的工具。 例如,我“进入”编程是因为我想为自己正在玩的游戏启动服务器,因此我在Google上搜索并阅读了对该特定服务器的支持,现在我是一名受雇的软件工程师,仅使用我开发的技能(然后通过对不太流行的服务器程序包编码C#脚本进行进一步开发)。 所以我的问题是,人们通常发现从这些书中学习起来更容易吗?我知道我看过其中的一些,发现它们太“干”了,无法鼓励我完成。

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.