软件工程

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

7
在PHP中类型转换变量,这样做的实际原因是什么?
正如我们大多数人所知道的,PHP具有弱类型。对于那些不喜欢的人,PHP.net说: PHP在变量声明中不需要(或不支持)显式类型定义。变量的类型由使用该变量的上下文确定。 喜欢它还是讨厌它,PHP会即时重新发布变量。因此,以下代码有效: $var = "10"; $value = 10 + $var; var_dump($value); // int(20) PHP还允许您显式转换变量,如下所示: $var = "10"; $value = 10 + $var; $value = (string)$value; var_dump($value); // string(2) "20" 太酷了……但是,对于我自己的一生,我无法想到这样做的实际原因。 我对支持Java的语言进行强类型输入没有问题。很好,我完全理解。另外,我知道-并充分了解- 函数参数中的类型提示的用处。 上面的引用解释了我类型转换的问题。如果PHP可以随意交换类型,即使您强制转换了类型,PHP也可以这样做。当您在操作中需要某种类型时,它可以即时执行。这使得以下内容有效: $var = "10"; $value = (int)$var; $value = $value . ' TaDa!'; var_dump($value); // string(8) "10 …

4
上游和下游服务采用哪种方式?
对于由多个相互调用的服务组成的系统(例如,前端->后端->存储),我经常听到人们使用诸如“下游”或“上游”服务之类的术语。我不清楚这些是指哪个方向。数据双向流动。请求从更多的面向用户的流向更多的后端服务,但是响应却朝相反的方向流动,因此在我看来,可以说是任一种

8
在OOP之前,数据结构成员是否公开?
使用OOP语言实现数据结构(例如,队列)时,数据结构的某些成员需要为私有的(例如,队列中的项目数)。 队列也可以使用struct和在上操作的一组函数以过程语言实现struct。但是,在过程语言中,您不能将成员struct设为私有成员。使用过程语言实现的数据结构的成员是否公开了,还是有一些技巧使其私有化?

7
我如何防止标题地狱?
我们正在从头开始一个新项目。大约有八位开发人员,一打左右的子系统,每个子系统都有四个或五个源文件。 我们怎样才能防止“标题地狱”(又名“意大利面条头”)? 每个源文件一个标头? 每个子系统加一个? 从函数原型中分离出typdef,结构和枚举? 将子系统内部与子系统外部分开? 坚持每个文件,无论标头还是源文件都必须是可独立编译的? 我并不是在寻求“最佳”方法,只是要指出要注意什么以及可能引起悲伤的指针,以便我们可以尝试避免这种情况。 这将是一个C ++项目,但是C信息将对将来的读者有所帮助。
44 c++  headers  include 

4
异常传播:何时应捕获异常?
MethodA调用MethodB,然后依次调用MethodC。 在MethodB或MethodC中没有异常处理。但是在MethodA中有异常处理。 在MethodC中发生异常。 现在,该异常正在冒泡到MethodA,该方法可以适当地对其进行处理。 这有什么问题? 在我看来,在某个时候调用者将执行MethodB或MethodC,并且当这些方法中确实发生异常时,从这些方法内部处理异常中可以获得什么,这实际上只是一个try / catch / finally块,而不仅仅是让他们冒泡给被呼叫者? 围绕异常处理的陈述或共识是,仅在执行不能继续执行时抛出该异常。我明白了。但是,为什么不在链的更深处捕获异常,而不是让try / catch块一直向下传播。 当您需要释放资源时,我会理解的。完全是另一回事。

2
基于角色与权限的访问控制
我试图了解访问控制(授权)时角色和权限之间的固有权衡。 让我们从一个给定的开始:在我们的系统中,“ 权限”将是一个细粒度的访问单位(“ 编辑资源X ”,“ 访问仪表板页面 ”,等等)。一个角色将是1 +权限的集合。一个用户可以具有1个以上的角色。所有这些关系(用户,角色,权限)都存储在数据库中,可以随时根据需要进行更改。 我的担忧: (1)检查用于访问控制的角色有何“坏处”?通过检查权限可获得什么好处?换句话说,以下这两个摘要有什么区别: if(SecurityUtils.hasRole(user)) { // Grant them access to a feature } // vs. if(SecurityUtils.hasPermission(user)) { // Grant them access to a feature } 和: (2)在这种情况下,角色甚至可以提供什么有用的价值?我们不能直接为用户分配1+权限吗?角色提供什么抽象的具体价值(有人可以提供具体示例)吗?

9
通过为每列设置预定义的数据类型,关系数据库能获得什么?
我现在正在使用SQL数据库,这一直使我感到好奇,但是Google搜索的机会并不多:为什么使用严格的数据类型? 我了解为什么会有几种不同的数据类型,例如区分二进制数据和纯文本数据很重要。现在,我知道将二进制数据存储为自己的格式比将二进制数据的1和0格式存储为纯文本要好得多。 但是我不明白的是拥有这么多种不同的数据类型的好处是什么: 为什么mediumtext,longtext和text? 为什么decimal,float和int? 等等 告诉数据库“此列的条目中只有256个字节的纯文本数据”有什么好处。或“此列最多可以包含16,777,215字节的文本条目”? 这是性能优势吗?如果是这样,为什么在事前知道条目的大小对性能有何帮助?或更确切地说是其他东西吗?

3
子类和子类型之间有什么区别?
关于这个问题的最高的答案是关于Liskov替代原理的努力,竭力区分子类型和子类。这也说明有些语言将两者混为一谈,而另一些则没有。 对于我最熟悉的面向对象语言(Python,C ++),“类型”和“类”是同义词。对于C ++,在子类型和子类之间进行区分意味着什么?举例来说,这Foo是的子类,但不是子类型FooBase。如果foo是的实例Foo,则此行: FooBase* fbPoint = &foo; 不再有效?

4
为什么结构和类在C#中是分开的概念?
在用C#编程时,我偶然发现了一个我无法理解的奇怪的语言设计决策。 因此,C#(和CLR)具有两种聚合数据类型:(struct值类型,存储在堆栈上,没有继承)和class(引用类型,存储在堆上,具有继承)。 首先,这种设置听起来不错,但随后您偶然发现了采用聚合类型参数的方法,要弄清楚它实际上是值类型还是引用类型,必须找到其类型的声明。有时可能会造成混乱。 解决该问题的公认方法似乎是将所有structs 声明为“不可变的”(将其字段设置为readonly),以防止可能的错误,从而限制structs的用途。 例如,C ++使用了更多可用的模型:它允许您在堆栈或堆上创建对象实例,并按值或按引用(或按指针)传递它。我一直听到C#的灵感来自C ++,但我不明白为什么它不采用这种技术。结合class并struct进入一个结构有两个不同的分配方案(堆和栈)和周围将它们作为值或(明确)经由引用ref和out关键字似乎是一个很好的事情。 问题是,为什么在C#和CLR中class并struct成为单独的概念,而不是具有两个分配选项的一种聚合类型?



7
系统可以100%进行数据驱动吗?
我的新老板已经在这个项目上工作了很多年。我只来过这里几个星期,但我不确定是否有可能。他想设计一个“ 100%数据驱动”的系统。 因此,如果我们输入足够的数据,则可以定义并生成任何应用程序。我至少设法让他承认某些事情,例如用户,或者应用程序应该具有预定义的值,但是他喜欢系统结构,用户界面和逻辑都存储为数据的概念。 这里有一些简单的演示,他基本上重新发现了一些面向对象编程和基本模板系统的简单想法,但总的来说,我认为这个目标实际上是不可能的。 我不知道如何在不使系统变得如此复杂以至于无法进行实际编程的情况下使用数据定义逻辑。 我认为从理论上讲,这不是因为解释数据的内容最终需要完整描述应用程序,因此您只是将问题上移了一层,甚至没有任何净收益。 这样的100%数据驱动应用程序有可能吗?

11
错误变量是反模式还是好的设计?
为了处理不应停止执行的几种可能的错误,我有一个error变量,客户端可以检查并使用该变量引发异常。这是反模式吗?有没有更好的方法来解决这个问题?有关此操作的示例,您可以查看PHP的mysqli API。假定正确处理了可见性问题(访问器,公共和私有范围,是类中的变量还是全局变量?)。


11
在域丰富的应用程序中检索报告和仪表板数据的最佳实践或设计模式
首先,我想说这似乎是一个被忽略的问题/领域,因此,如果这个问题需要改进,请帮助我将此问题变成一个有益于他人的好问题!我正在寻求实施解决方案的人员的建议和帮助,而不仅仅是尝试的想法。 根据我的经验,应用程序有两个方面-“任务”方面,这主要是域驱动的,用户可以在其中与域模型(应用程序的“引擎”)进行丰富的交互,而报告方面则是用户根据任务侧发生的情况获取数据。 在任务方面,很显然,具有丰富域模型的应用程序应在域模型中具有业务逻辑,并且数据库应主要用于持久性。分离关注点,每本书都为此而写,我们知道该怎么做,太好了。 报告方面呢?数据仓库是可以接受的,还是由于将业务逻辑合并到数据库以及数据本身而设计不当?为了将数据库中的数据聚合到数据仓库数据中,您必须对数据应用业务逻辑和规则,并且该逻辑和规则不是来自您的域模型,而是来自您的数据聚合过程。错了吗 我致力于业务逻辑广泛的大型财务和项目管理应用程序。在报告这些数据时,我经常会做很多汇总工作以提取报告/仪表盘所需的信息,并且这些汇总中有很多业务逻辑。为了提高性能,我一直在使用高度聚合的表和存储过程进行此操作。 例如,假设需要一个报告/仪表板来显示活动项目的列表(设想10,000个项目)。每个项目将需要显示一组指标,例如: 总预算 迄今为止的努力 燃烧率 以当前消耗率计算的预算用尽日期 等等 这些都涉及很多业务逻辑。我不仅在谈论乘数或一些简单的逻辑。我说的是为了获得预算,您必须应用一个包含500个不同费率的费率表,每个费率适用于每个员工的时间(在某些项目中,其他项目具有乘数),应用费用和任何适当的加价等。逻辑是广泛的。为了使客户端在合理的时间内获得大量数据,需要进行大量的聚合和查询调整。 应该首先在域中运行它吗?性能如何?即使使用直接的SQL查询,我也无法获得足够快的数据以使客户端在合理的时间内显示。我无法想象如果要重新为所有这些域对象补水,并在应用程序层中混合,匹配和聚合它们的数据,或者试图在应用程序中聚合数据,那么尝试将这些数据足够快地发送到客户端。 在这些情况下,SQL似乎擅长处理数据,为什么不使用它呢?但是,那么您在域模型之外就有了业务逻辑。对业务逻辑的任何更改都必须在您的域模型和报告聚合方案中进行更改。 对于域驱动设计和良好实践,如何设计任何应用程序的报告/仪表板部分,我实在感到茫然。 我添加了MVC标签,因为MVC是jour的设计风格,并且在我当前的设计中使用了它,但无法弄清楚报告数据如何适合此类应用程序。 我正在寻找这方面的任何帮助-书籍,设计模式,谷歌关键字,文章等等。我找不到有关此主题的任何信息。 编辑和另一个例子 我今天遇到的另一个完美的例子。客户需要为客户销售团队提供报告。他们想要看似简单的指标: 对于每个销售人员,他们迄今为止的年销售额是多少? 但这很复杂。每个销售人员参加了多个销售机会。有些人赢了,有些人没有。在每个销售机会中,都有多个销售人员,每个销售人员根据其角色和参与度分配一定比例的销售功劳。因此,现在想象一下要遍历该域...为每个销售人员从数据库中提取此数据所需要做的对象补液量: 获取所有SalesPeople-> 对于每个获取其SalesOpportunities-> 对于每个获取其销售百分比并计算其销售金额, 然后将所有SalesOpportunity销售金额相加。 这是一个指标。或者,您可以编写一个SQL查询,该查询可以快速有效地完成并对其进行快速调整。 编辑2- CQRS模式 我已经阅读了有关CQRS模式的信息,尽管很有趣,但即使是马丁·福勒(Martin Fowler)也说它未经测试。那么BEEN过去如何解决这个问题。每个人在某个时候或某些时候都必须面对这一点。具有成功记录的既定方法或陈旧方法是什么? 编辑3-报告系统/工具 在这种情况下,要考虑的另一件事是报告工具。Reporting Services / Crystal报表,Analysis Services和Cognoscenti等都希望从SQL /数据库获取数据。我怀疑您的数据稍后会通过您的业务。然而,在许多大型系统中,它们和其他类似的对象仍然是报告的重要组成部分。在这些系统的数据源甚至报告本身中甚至存在业务逻辑的地方,如何正确处理这些数据?

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.