软件工程

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

14
ORM使用数据库抽象有什么好处?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我开始使用我选择的框架推荐的ORM,尽管我喜欢ORM提供的附加抽象层的想法,但我开始意识到这实际上意味着什么。这意味着我不再使用数据库(mysql),并且所有特定于mysql的功能都消失了,就像它们不存在一样。 ORM的想法是,它试图通过使所有数据库不可知来帮助我。这听起来不错,但是通常我选择特定的数据库系统是有原因的。但是通过走数据库不可知路线,ORM会采用最低的公分母,这意味着我最终会获得最小的功能集(所有数据库都支持这些功能)。 如果我知道从长远来看不会切换基础数据库怎么办?为什么还不访问特定于数据库的功能?

17
编程需要了解哪些良好的数学公式?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 您学到了哪些通用数学公式,这些公式可以帮助您编写更好的算法并成为更好的程序员? 示例:我了解了ecludian距离公式:sqrt((x1-x2)^2+(y1-y2)^2)通过比较两个因素,它帮助我了解了如何找到相似的物体。

8
如果每年要学习一种新的编程语言,该清单应该是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 在“实用程序员”的第一章中,第一个学习目标是: 每年至少学习一种新语言。不同的语言以不同的方式解决相同的问题。通过学习几种不同的方法,您可以帮助拓宽思路,避免发疯。[...] 为了在职业生涯中实现这一目标,语言列表可能会很长(特别是如果您不想“进入”管理阶段)。显然,对程序员(或任何形式)的教育将使您开始使用商业上有用的语言的核心(职位发布中的常用列表:C,C ++,Ruby,Python,JavaScript,C#,Java,VB等)。 )。另外,正式或非正式的学习计划可能涵盖了功能方法(通过诸如Haskell,LISP或ML衍生语言之类的方法) 但是,一旦了解到该列表的合理子集,下一步是什么?为什么?

3
团队中高级开发人员和初级开发人员的理想组合是什么?
在任何团队中,您都将需要更多灰白色的开发人员和一些幼崽。一些原因包括: 钱。通常,有些任务不需要相同水平的经验即可交付,因此不要为完成这些任务付出高昂的代价。 能源。新人们可以带给团队充满活力和热情,以阻止其变得过时和过时。更高级的人可以带来平静和智慧。 知识转移和职业发展。无论是在项目还是在技能上,教人和学习新知识都是有用的,而且常常很有趣。帮助“培养”新的团队成员感到很满意。 我意识到有一些最前沿的项目,对于其中的高级人员要比初级人员要多,这可能很重要,但是总的来说,团队中是否有理想的经验组合,还是完全取决于项目?

6
有人使用过Sproutcore吗?
有没有人将Sproutcore用于Web应用程序?如果是这样,您能给我介绍您的经历吗?我目前正在考虑,但我有一些担忧。首先,文档是不好的/不完整的,而且恐怕我将花费大量时间来弄清事物或挖掘源代码。另外,我对使用一个相对较新的项目可能会有所犹豫。 感谢Sproutcore开发人员的任何想法! EDIT / PS:是的,我看过这篇文章:https : //stackoverflow.com/questions/370598/sproutcore-and-cappuccino。但是,我对某个用于重大项目的人对Sproutcore本身的描述加长了兴趣。
19 javascript 


6
什么时候应该使用存储过程?
如果我将所有业务逻辑都包含在代码中并使用Entity Framework,那么在什么情况下(如果有),将某些业务逻辑移至存储过程中而不是将其全部保留在代码中会更好吗? 需要明确的是,我的意思是与当前设置(代码中的业务逻辑)结合使用,而不是与其结合使用。我已经看到了许多类似的问题,这些问题都要求在存储过程中拥有所有业务逻辑的利弊,但是对于保留少量使用边缘过程逻辑的同时保留其余业务逻辑的情况,我没有发现太多的益处在代码中。 如果有所作为,我正在使用MSSQL和Entity Framework。 在以下情况下,我曾使用过存储过程: 一份复杂的报告需要几分钟才能运行(这是Web应用程序中的页面)。我发现我可以编写比LINQ提供的SQL更有效的SQL(只需花费几秒钟即可运行)。 一个Web应用程序需要读写一个单独数据库中的几个表,其中包含许多其他与该应用程序无关的敏感信息。我没有给它访问所有内容的权限,而是使用了一个存储过程,该过程仅执行所需的操作,并且仅返回有限的信息。然后,可以只给Web应用程序访问此存储过程的权限,而不能访问任何表等。 在问这个问题之前,我查看了其他帖子: 存储过程是全球最大的IT软件咨询公司之一的不良做法? 在Web应用程序的存储过程中保存所有业务逻辑的利弊 /programming/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code /dba/2450/what-are-the-arguments-against-or-for-putting-application-logic-in-the-database/2452#2452 什么时候不使用ORM而更喜欢存储过程?

3
通过方法链传递上下文的模式
这是出现要拿出相当多的设计决策:如何通过上下文通过并不需要它,做的方法等。是否有一个正确的答案,或者它取决于上下文。 需要解决方案的示例代码 // needs the dependency function baz(session) { session('baz'); } // doesn't care about the dependency function bar() { baz(); } // needs the dependency function foo(session) { session('foo') bar(); } // creates the dependency function start() { let session = new Session(); foo(session); } 可能的解决方案 本地线程 全球 上下文对象 …

1
为什么(/ did)Bertrand Meyer认为子类化是扩展“封闭式”模块的唯一方法?
在Meyer的“ 面向对象的软件构造”(1988)中,他将开放/封闭原则定义如下: 如果模块仍可扩展,则称其为打开状态。例如,应该可以向其包含的数据结构添加字段,或者向其执行的功能集添加新元素。 如果某个模块可供其他模块使用,则将其称为已关闭。假设已为模块提供了良好定义的稳定描述(信息隐藏的界面)。 他接着说: 如果重新打开模块,则还必须重新打开其所有客户端以对其进行更新,因为它们依赖于旧版本。…[此问题]每当模块必须由新功能或数据元素扩展时触发,从而触发直接和间接客户端中的更改。...使用经典的设计和编程方法,无法编写打开和关闭的模块。 Meyer解决这个难题的方法是:永远不要通过修改现有的类来扩展库模块;而是编写一个新模块来对现有类进行子类化,并使新客户端依赖于该新模块。 现在,在1988年,我正在用Turbo Pascal和Blankenship Basic编写玩具(程序)程序,而我在21世纪的专业经验是使用JVM,CLR和动态语言,所以我不知道Meyer的意思。通过“经典的设计和编程方法”。 Meyer的一个具体示例说明了为什么必须重新打开客户端模块(枚举上的switch语句,现在有更多的成员,需要更多的情况)似乎很合理,但是他几乎没有断言每次向库添加功能时都会断言模块,您需要更新其所有客户端。 是否有历史原因使该主张在1988年显得不言而喻?例如,向C静态库添加函数或数据结构是否更改了布局,以至于即使使用向后兼容的API,也必须重新编译客户端?还是Meyer真的只是在谈论一种用于强制API向后兼容的机制?

4
Chrome V8如何运作?为什么JavaScript最初不是JIT编译的?
我一直在研究解释器/编译器,然后偶然发现了JIT-Compilation-特别是Google Chrome的V8 Javascript Engine。 我的问题是- 怎么会比标准口译更快呢? 为什么不首先使用JIT-Compilation? 我目前的理解 每个Javascript程序都从源代码开始,然后不管执行方法如何,最终都将其翻译为机器代码。 无论JIT编译和解释必须遵循这条道路,所以JIT编译怎么会有更快的(也因为JIT是有时间限制的,不像AOT编译)? 基于Wikipedia的JIT-Compilation Article,JIT-Compilation似乎是一个相对较旧的创新。 “最早发布的JIT编译器通常归功于McCarthy在1960年对LISP的研究。” “ Smalltalk(约1983年)开创了JIT编译的新方面。例如,按需转换为机器代码,并将结果缓存起来供以后使用。当内存不足时,系统将删除部分代码并重新生成再次需要它时。” 那么,为什么解释Javascript 开头呢? 我很困惑,对此我做了很多研究,但没有找到满意的答案。 如此简洁明了的答案将不胜感激。并且,如果需要引入有关解释器,JIT编译器等的更多解释,也将不胜感激。

6
在实现旁边记录是否违反SRP?
在考虑敏捷软件开发和所有原理(SRP,OCP等)时,我问自己如何对待日志记录。 在实现旁边记录是否违反SRP? 我会说,yes因为该实现也应该能够运行而无需登录。那么如何更好地实现日志记录呢?我检查了一些模式,得出的结论是,最好不要以用户定义的方式违反原则,而是使用已知违反原则的任何模式的最佳方式是使用装饰器模式。 假设我们有一堆完全没有违反SRP的组件,然后我们想要添加日志记录。 成分A 组件B使用A 我们想要记录A,因此我们创建了另一个装饰有A的组件D,都实现了接口I。 接口我 组件L(系统的日志记录组件) 组件A实现I 组件D实现I,修饰/使用A,使用L进行日志记录 组件B使用I 优点:-我可以不使用日志就使用A-测试A意味着我不需要任何日志模拟-测试更简单 缺点:-更多组件和更多测试 我知道这似乎是另一个公开讨论的问题,但我实际上想知道是否有人使用的记录策略比装饰器或SRP违规更好。作为默认NullLogger的静态单例记录器又如何呢?如果需要syslog-logging,则在运行时更改实现对象?

7
编码样式问题:我们是否应该具有接受参数,修改参数然后返回该参数的函数?
关于这两种做法仅仅是同一枚硬币的两个方面,还是一个真的更好,我正在和我的朋友进行辩论。 我们有一个函数,该函数需要一个参数,填写其中的一个成员,然后返回它: Item predictPrice(Item item) 我相信,由于它可以处理传入的同一对象,因此没有必要继续返回该项目。实际上,从调用者的角度来看,如果有任何事情,它将使您感到困惑,因为您可以期望它返回一个新项目,而不会。 他声称这没有什么区别,即使它确实创建了一个新Item并返回它也没有关系。我强烈不同意,原因如下: 如果您对传入的项有多个引用(或使用指针或其他方式),则分配一个新对象并返回该对象具有重要意义,因为这些引用将是不正确的。 在非内存托管语言中,分配新实例的函数声明了内存的所有权,因此我们将必须实现在某个时候调用的清理方法。 在堆上分配可能很昂贵,因此,对于被调用函数是否执行此操作很重要。 因此,我认为能够通过方法签名查看是修改对象还是分配新对象非常重要。结果,我认为由于函数仅修改传入的对象,因此签名应为: void predictPrice(Item item) 在我使用过的每个代码库中(公认的C和C ++代码库,而不是Java,这都是我们正在使用的语言),上述样式基本上得到了遵守,并且由经验更为丰富的程序员所遵循。他声称,由于我的代码库和同事的样本量在所有可能的代码库和同事中所占的比例很小,因此,我的经验不能真正表明一个人是否优越。 那么,有什么想法吗?

1
有人可以解释V模型的过程吗?为什么与瀑布模型不同?
似乎V模型只是瀑布模型,其瀑布的下半部分向上弯曲以形成V。我不知道它如何添加任何新内容。 从图中,我也不了解流程。有指向各个方向的箭头,我不明白首先要做什么。我们是否从左上方跟随V,向下到底部中心,然后再回到右上方?还是我们降低V,在物品降低之前先做所有升高的事情? 互联网对此模型缺乏足够的解释。如果有人可以用真正的StackExchange形式解释它,那就太好了:)

3
如何在不使用递归的情况下遍历树?
我的内存节点树很大,需要遍历该树。将每个子节点的返回值传递到其父节点。必须这样做,直到所有节点的数据都泡到根节点为止。 遍历是这样的。 private Data Execute(Node pNode) { Data[] values = new Data[pNode.Children.Count]; for(int i=0; i < pNode.Children.Count; i++) { values[i] = Execute(pNode.Children[i]); // recursive } return pNode.Process(values); } public void Start(Node pRoot) { Data result = Execute(pRoot); } 这工作正常,但我担心调用堆栈会限制节点树的大小。 如何重写代码,以便不进行递归调用Execute?
19 c#  optimization  trees 

4
使不依赖实例字段的方法变为静态吗?
最近,我开始在Groovy中为Java项目的集成测试框架进行编程。我将Intellij IDEA与Groovy插件一起使用,我很惊讶地看到所有非静态方法并且不依赖于任何实例字段,这是一个警告。但是,在Java中,这不是问题(至少从IDE的角度来看)。 是否将所有不依赖于任何实例字段的方法都转换为静态函数?如果为true,这是特定于Groovy还是通常可用于OOP?又为什么呢

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.