软件工程

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

6
在编码之前设计OOP系统的简单过程是什么?
每当需要构建项目时,我总是设法进行构建,而不是事先设计计划或设计,而是在首先编写了需要的类之后,从下至上充实整个项目。现在,我知道这不是创建软件的正确方法,但是对我来说,将其包裹在所谓的面向对象的分析和设计上并不容易。我可以更容易地理解自上而下的程序设计,因为它只包含将任务分解为子任务,这些子任务在代码,功能上与之相对。但是我不容易理解面向对象的分析和设计,因为我不理解人们如何知道他们将需要哪些类以及它们将如何交互,除非他们知道如何对它们进行编码。 因为一旦在设计过程中引入了类和对象的概念,就不能再自上而下进行设计,因为我们不再将问题分解为可以作为过程实现的事物。相反,根据我对该主题的了解,我们必须确定需要哪些类,并在统一建模语言中创建各种工件,然后在实现软件时就可以使用这些工件。但是这种设计过程我不明白。除非他们已经构思了整个系统,否则如何知道他们将需要哪些类以及它们将如何交互? 这就是我的问题。尽管我确实了解面向对象编程的概念,但是我不了解如何设计面向对象的系统,并且可以在我知道的任何面向对象编程语言中使用这些概念。因此,我需要有人向我解释可以使用对我来说有意义的方式设计面向对象系统的简单过程。

3
学习专门为该公司设计的编程语言
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加细节并通过编辑此帖子来澄清问题。 2年前关闭。 当您拥有XY其他可以帮助您的库,逻辑等的语言时,为什么有人会开发自己的语言以仅在该公司内部使用呢?将流程与其他内容一起使用,而不是开发自己的语言,不是很简单吗?

2
参数化方法与全局变量
当我的代码开始增长时,我有一个很简单的问题困扰了我一段时间。 当参数经过嵌套函数调用的长路径时,是否应将其替换为全局变量? 我知道全局环境会使程序的状态不可预测,因为许多函数可以修改共享变量,但是全局空间仍然使事情变得如此容易。 让我解释一下自己: functionA(){ x = something functionB(x) } functionB(x){ functionC(x) } functionC(x){ finallyDoSomethingWithX(x) } finallyDoSomethingWithX(x){ x += 1 //Very dummy example ignoring pass by value, not reference. } 取而代之: globalX; functionA(){ globalX = something functionB() } ... ... ... finallyDoSomethingWithX(){ globalX += 1 } 我觉得第二种方式给程序带来了很大的自由度,因为参数很容易累积,并且有时在必须重用代码时可能会受到很大的限制,但是与此同时,我觉得函数在与变量相关时会失去其模块化在全球环境中,例如当我想finallyDoSomethingWithX使用另一个变量tha 时,它也失去了可重用性globalX。 我认为这是发生在我身上的原因,因为我实际上不是在使用设计模式,因为我使用Javascript进行编程,对我而言,这感觉像是针对中型项目的所有语言的一种脚本交易。 有什么建议吗?模式?如果需要,我可以更具体。

4
是否有用于记录程序高级体系结构的标准?
我是一名业余开发人员,到目前为止,我的所有程序都很简单,可以在代码中进行记录。在阅读代码时,很清楚我在做什么和这样做(我的标准测试是6个月后查看代码,并在初读时了解所有内容-我的内存跨度很短)。 我现在面对的是一个程序,该程序超出了我记住这些程序之间各种交互的能力。 代码本身 数据库中的索引 各种模块之间的交互(“工作人员”核心代码和“库”模块) 我当前的文档是一个白板,其中有各种各样的框和箭头,它们指向代码,数据库索引,正在执行的操作,状态更改等。仅供参考,一团糟: 我的问题是,对于更复杂的产品的文档记录,是否存在一套标准的或最佳实践的最佳实践集(命名为这是一组以特定名称分组的实践)。 我应该寻找什么关键字(对“文档软件体系结构标准”的一般尝试以及类似的变体,通常会导致用于工作流或建筑体系结构CAD系统的软件)。 我还希望对高级描述没有通用的最佳实践,并且每个人都可以建立自己的哲学。

3
依赖注入:我应该创建一个Car类来容纳其所有零件吗?
我的C ++应用程序中有很多赛车都包含在RaceTrack中。 每辆汽车由数百个零件组成。每个部分都依赖于另外一两个部分。 我已经在DI和Mark Seemann的书上阅读了很多SO问题,并且看起来我不应该为了容纳汽车零件而定义Car类,因为所有汽车零件都将相互依赖,而零件的本质就是汽车。我对吗? 因此,当我将所有赛车放入RaceTrack时,将没有汽车实体,而是很多汽车零件,这取决于彼此在赛道上的比赛??我对吗? 编辑: 很长时间以来,我都在编写汽车类课程,因为对于我来说,如果我编写汽车逻辑学,很显然我需要汽车类。但是使用DI并不是很明显。还是想知道,如果我没有定义角色,那么不创建Car类是DI的惯用做法吗? 我的意思是,可以在没有用于整体代表汽车的实例的情况下,为驾驶人员配备SteeringWheel,为维修人员提供BoltsAndNuts车轮以及其他各种有趣的接口吗?

6
与挨饿的开发团队怎么办?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 作为普通开发人员,这很关键,特别是在您迟到的时候。当您是高级开发人员时,团队正在寻求领导才能,那就更糟了。 当大部分团队的工作停滞不前,等待一些关键任务时,其余团队应该怎么做?我们访问关键部分的机会有限,因此无论我们做什么,其他人都将一直在等待。当其他人在寻求关于如何做的建议时,什么是好的答案?

8
哪种算法需要一套?
在我的第一门编程课程中,我被告知我每当需要执行某些操作(例如删除某些重复项)时都应该使用一组。例如:要从向量中删除所有重复项,请遍历所述向量并将每个元素添加到集合中,然后剩下唯一的情况。但是,我也可以通过将每个elemento添加到另一个向量并检查该元素是否已经存在来做到这一点。我假设根据所使用的语言,性能可能有所不同。但是,除了其他原因,还有其他理由使用吗? 基本上:哪种算法需要一个集合,而其他任何容器类型都不应该完成?

2
大规模Scrum(LeSS)和大规模敏捷框架(SAFe)的预期或目标组织规模是多少?
《Scrum指南》定义了一个由产品所有者,3至9个成员的开发团队以及1个介于5至11个成员之间的Scrum Master组成的单个单元。我见过产品负责人可能有支持人员,或者团队可能没有专门的Scrum Master来稍微改变这个数字的情况,但似乎最多只能有十几个人。 的的Nexus指南介绍了Scrum的缩放处理3-9 Scrum团队单一产品工作的一种方法。它增加了一个新的Nexus集成团队,该团队可以是专门成员,也可以由来自各个Scrum团队的人员组成。根据该指南,它将扩展到大约20-120个人。 纪律严明的团队可以从一个团队扩展到N个团队。一个标准的个人团队规模将与Scrum中的团队规模相同-3-9个成员,加上来自各种专家,独立测试团队,领域专家等的支持角色。此框架中的考虑不仅是扩展规模,而是应用敏捷方法在大型组织中,受监管的环境具有强制性的合规性,外包,全球分布的团队。似乎限制是每个产品或产品线只能有一个DA实例。 在不同程度上,我一直参与使用Scrum,Nexus和DAD进行工作或实施流程,因此我对它们有扎实的了解。除了我在阅读别人说的以外,我还没有LeSS和SAFe的工作知识。 LeSS似乎很简单。它是Nexus的替代产品,具有更大的扩展能力。LeSS的规则规定,LeSS是为2-8个团队设计的,而LeSS Huge是为8个以上团队设计的,我估计LeSS的开发组织规模约为15-80,LeSS Huge的开发组织规模约为80+。根据您的组织,您可能会在LeSS的产品组织中寻找20-110人,在LeSS Huge中寻找100+人,其中包括管理,独立质量检查,运营等等。两种形式的LeSS似乎都针对单个产品,或者针对一组紧密相关的产品(例如一条产品线或一组微服务)。每个产品都有自己的LeSS(或LeSS Huge)实例。 SAFe似乎涵盖了整个组织-运营,用户体验,企业架构师和系统工程师,产品经理,质量保证,开发人员等。它具有两个模型-3级组织和4级组织。3级组织标识团队,计划和项目组合。四个级别的组织在计划和项目组合之间添加了一个价值流​​级别。根据确定的角色数量,这似乎是针对具有多种产品和并发程序的大型企业组织。阅读他们的实施指南,他们似乎希望实施组织会培训高管和管理层,然后再培训至少50名开发团队成员。最小的组织规模似乎是在所有确定的组中只有数百人,并且有多种产品使实施有意义。 我认为LeSS是Nexus在目标受众方面的“竞争者”,而SAFe的目标是拥有大量产品或产品线的大型组织,远远超过其他规模化的敏捷框架吗?

3
如果使用Firebase,在哪里放置业务逻辑?
我将开始开发一个单页面Web应用程序,该应用程序非常简化了多用户文档系统。前端可能会使用Angular2。 该项目的期限很短,因此我一直在寻找“捷径”,即使用各种现成的服务,而不是从头开始实现所有内容。 我将需要某种后端来存储应用程序数据。我环顾四周,发现Firebase,它似乎取消了创建单独的后端和API以与前端通信的工作。 但这也意味着我必须将业务逻辑放在Angular2 Web应用程序的前端,对吗? 因此,如果我将来某天想做一个移动应用程序的前端,我是否必须复制业务逻辑代码? 我想替代方案是创建一个包含业务逻辑并使用Firebase进行数据存储的后端,但这似乎有点不可思议(我不能只在后端使用ORM或其他东西来获得相同的结果,而无需还有很多工作吗?) 例如,如果人们想使用Firebase,人们通常如何构造这类应用程序?

1
是否存在使用弱引用而不是简单组合更好的情况?
虽然Java文档指定,即弱引用主要用于映射进行规范化,你会发现很多,很多,很多人在互联网上声称,该WeakHashMap中是完美的在其一生中存储的对象元数据。但是,没有人愿意做一个易于理解和适当的例子。 使用WeakHashMap向对象添加一些属性或存储元数据的声音对我来说,就像一个基于将要使用该死的东西的意愿的任意决定。换句话说-一个不好的设计。我了解,在某些情况下继承可能不可用(最终类,接口),但是组合又如何呢?我想不出一个例子,其中组合不是一种选择。当然,这是一个更好的选择,因为它依赖于公认的原则,而不是“语言怪癖”。 那么,有没有一种情况,使用弱引用而不是简单的组合会更好?如果没有,为什么互联网上的每个人似乎都会出错?


2
当线程在while循环内等待任务时,会发生什么?
在处理了C#的async / await模式一段时间之后,我突然意识到我不太了解如何解释以下代码中发生的情况: async void MyThread() { while (!_quit) { await GetWorkAsync(); } } GetWorkAsync()假定返回一个等待对象Task,该等待对象在执行继续操作时可能会或可能不会导致线程切换。 如果等待不在循环内,我不会感到困惑。我自然希望该方法的其余部分(即延续)可以在另一个线程上执行,这很好。 但是,在一个循环中,“其余方法”的概念让我有些迷惑。 如果线程是在连续状态下打开的,而线程没有被打开,那么“其余的循环”会怎样?在哪个线程上执行循环的下一个迭代? 我的观察表明(未最终验证),每个迭代都在同一线程(原始线程)上开始,而延续在另一个线程上执行。真的可以吗?如果是,那么这是否是某种程度的意外并行性,需要解决GetWorkAsync方法相对于线程安全性的问题? 更新:我的问题并非如某些人所建议的重复。该while (!_quit) { ... }代码模式仅仅是我的实际代码的简化。实际上,我的线程是一个长寿命的循环,它以固定的时间间隔(默认为每5秒)处理其工作项的输入队列。实际的退出条件检查也不是示例代码所建议的简单的字段检查,而是事件句柄检查。
10 c#  loops  async 

2
如何在CQRS中创建新的聚合根?
我们应该如何在cqrs体系结构中创建新的聚合根?在此示例中,我想创建新的聚合根AR2,其中包含对第一个AR1的引用。 我正在使用AR1方法作为起点来创建AR2。到目前为止,我看到的选择很少: 在AR1的内部方法中,createAr2RootOpt1我可以new AR2()使用具有访问存储库权限的域服务立即将该对象调用并将其保存到db。 我可以在第一个聚合根发出事件,例如。SholdCreateAR2Event然后有无状态的传奇对此做出反应并发出命令CreateAR2Command,该命令随后被处理并实际创建AR2并发出AR2CreatedEvent。如果使用事件源SholdCreateAR2Event,则不会将其保留在事件存储中,因为它不会影响第一个聚合根的状态。(或者我们还是应该将其保存在事件存储中?) class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void …

3
事件源,一个事件,两个聚合的状态已更改
我正在尝试学习DDD和相关主题的方法。我想到了一个简单的有界上下文来实现“银行”的想法:有帐户,可以在它们之间存入,提取和转移资金。保留更改历史也很重要。 我确定了Account实体,并且事件来源可以很好地跟踪其中的更改。其他实体或值对象与该问题无关,因此我不会提及它们。 考虑存款和取款时-这相对简单,因为只修改了一个汇总。 转移时有所不同-必须通过一个MoneyTransferred事件来修改两个聚合。DDD不赞成在一个事务中修改多个聚合。另一方面,事件源的规则是将事件应用于实体并基于它们修改状态。如果事件可以简单地存储在数据库中,那就没有问题。但是,为了防止同时修改事件源实体,我们必须对每个聚合的事件流实施某种版本控制(以保持其事务界限)。版本控制带来了另一个问题-我无法使用简单的结构来存储事件并读回它们以将其应用于聚合。 我的问题是-如何将这三个原则结合在一起:“一个交易合计一笔交易”,“事件->总交易变更”和“防止并发修改”?

1
异构开发环境是否有优势?
我与一组开发人员一起工作,他们可以选择运行什么硬件和软件。我们的感觉是,这种情况使我们在进行测试之前就可以看到各种各样的目标系统。我们的经验是,引入问题后不久,我们便在不同的浏览器和操作系统中发现了许多奇怪的问题。但这只是一个小组的经验。 对于我们的基础架构和安全团队来说,各种各样的系统很困难,因此经常会出现一个痛点。 在一个开发人员团队中拥有同构或异构开发环境是否更有益?

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.