Questions tagged «business-logic»

9
数据库应实现多少业务逻辑?
我参与过一些项目,其中大多数业务逻辑是在数据库上实现的(主要是通过存储过程)。另一方面,我从其他程序员那里听说这是一个不好的做法(“那里有数据库来存储数据。其余的则由应用程序来完成”)。 通常,哪种方法更好? 我能想到的在数据库中实现业务逻辑的优点是: 集中业务逻辑; 应用程序类型,编程语言,操作系统等的独立性; 数据库不太容易进行技术移植或大型重构(AFAIK); 无需重新进行应用程序技术迁移(例如:.NET到Java,Perl到Python等)。 缺点: 由于缺乏面向应用程序的语言所提供的库和语言构造,SQL对于业务逻辑编程而言效率较低,并且更为复杂。 通过库更难(如果可能的话)重用代码; 生产效率较低的IDE。 注意:我正在谈论的数据库是关系型,流行的数据库,例如SQL Server,Oracle,MySql等。 谢谢!

5
为什么要在模型中加入业务逻辑?当我有多种类型的存储时会怎样?
我一直认为业务逻辑必须在控制器中,并且控制器(因为它是“中间”部分)保持静态,并且模型/视图必须通过接口进行封装。这样,您可以在不影响任何其他因素的情况下更改业务逻辑,对多个模型(每个数据库/存储类型一个)进行编程,并为多个视图(例如针对不同的平台)编程。 现在,我在这个问题中读到,您应该始终将业务逻辑放入模型中,并且控制器与视图紧密相连。 对我来说,这没有任何意义,它意味着每次我想拥有一种支持另一种数据库/存储类型的方法时,都必须重写包括业务逻辑在内的整个模型。 如果我想要另一个视图,则必须重写视图和控制器。 有人可以解释为什么会这样,还是我在某个地方出错了?

3
在MVC设计中将业务逻辑放在哪里?
我创建了一个简单的MVC Java应用程序,该应用程序通过数据表单将记录添加到数据库中。 我的应用程序收集数据,还对其进行验证和存储。这是因为数据是从其他用户在线获取的。数据本质上大部分是数字。 现在,在要存储到数据库(SQL Server)中的数字数据上,我希望我的应用执行计算并显示结果。用户对如何完成计算不感兴趣,因此必须将其封装。用户必须只能查看简单的计算数据(例如,A列数据减去B列数据除以C列数据)。我知道如何编写存储过程,但是我想要一个三层应用程序。 我希望通过对数据库进行计算来处理作为记录放入数据库中的数据。原始数据应保持不受影响,而新数据(计算后)必须作为新实体记录存储到数据库中。 我应该在哪里编写该后台计算代码?因为它是规则和业务逻辑,所以我应该将其放在新的JavaBeans文件中吗?


3
python业务逻辑应放在Django的确切位置
我刚刚开始学习Django / Python / Web开发。这个问题已经困扰我一段时间了。 我正在Django中创建带有多个模板的应用程序。我有一个views.py,它基本上只是呈现对相应模板的响应,并且我有一个我在其中构造数据库的model.py。在我的一个模板中,我需要上传一个图像(我能做到),并且我需要运行一个基于上传图像特性的逻辑(尚未完成)。这种逻辑涉及许多繁重的计算。执行计算后,逻辑应将一些已处理的信息(坐标)返回到模板。 我已经能够在一个独立的python桌面应用程序中成功地完成所有这些操作,一个又一个地调用python文件。但是,由于我现在想使它成为Web应用程序,所以我开始使用Django框架。 我已经做了很多搜索,但仍然无法弄清楚应将包含所有逻辑的Python文件放在哪里。我是否应该有另一个基于类的文件(logic.py),并从中调用它view.py?我在Google上搜索后发现,许多开发人员将其业务逻辑放在Django的models.py中。但是,我认为从直觉上来说是不正确的,因为模型应该专门与后端进行通信。任何帮助将不胜感激。

2
如果不是“所有非第三方代码”,“业务逻辑”实际上意味着什么?
我听说人们经常在工作中和在线上谈论业务逻辑,并且我已经在此站点上阅读了一些有关它的问题,但是这个词对我来说仍然没有多大意义。例如,以下是我经常看到的一些(释义)语句: “业务逻辑是程序中编码实际业务规则的部分。” 我读过的大多数定义都是这样的循环定义。 “业务逻辑是您的特定应用程序所独有的一切。” 我不认为这与“您的特定应用程序不过是业务逻辑”有什么不同,除非我们不小心重新发明了一些轮子,可以使用现有的第三方软件。因此,问题标题。 “在数据访问层上方和GUI层下方应该有一个业务逻辑层。” 在我编写的代码中,数据库访问者必须知道他们应该访问什么数据,UI代码必须知道很多关于其显示内容的信息才能正确显示,这之间没有任何实际要做的事情。除了在客户端和服务器之间传递数据Blob之外,还有这两个地方。那么,实际上应该放入业务逻辑层的内容是什么? “业务逻辑应与表示逻辑分开。” 我们收到的大多数功能请求都是出于业务原因更改展示逻辑。如果业务规则之一是默认情况下以32位符号显示美国政府债券价格(同时还为用户提供配置UI的功能),则表示逻辑至少需要知道该规则存在(如果未完全实现)。而且,UX设计的主要部分似乎是帮助用户了解我们的软件试图实现的业务规则。 我是否有可能实际上只在一个只包含业务逻辑的团队中工作,而所有非业务逻辑都由其他团队来完成?还是“业务逻辑”作为一个单独实体的整个概念仅适用于某些应用程序或体系结构? 为了使答案更具体:假设您必须重新实现Domino的Pizza应用程序。什么是业务逻辑,该应用程序的非业务逻辑是什么?以及如何在不将大多数披萨信息渗入数据访问和表示层的情况下,将披萨订购业务逻辑放入其自己的代码“层”中? 更新:我得出的结论是,我的团队可能正在执行90%的UI代码,并且您所称的大多数(但不是全部)业务逻辑都来自其他团队或公司。基本上,我们的应用程序是用于监视财务数据以及几乎所有功能都是用户自定义其所见以及所见方式的方式。没有进行买卖(尽管我们与公司的其他应用程序进行了一些集成),并且实际数据由大量外部资源提供。但是我们确实允许用户执行诸如将其“监视器”的副本发送给其他用户之类的事情,因此我们处理方式的详细信息可能符合业务逻辑。实际上,目前有一个移动应用程序正在与我们的一些后端代码进行对话,并且我确切地知道我希望在理想的世界中与我们的UI共享前端代码的哪一部分(基本上是准MVC中的M),因此我猜这就是我们的BLL。 我接受user61852的回答,因为它使我对“业务逻辑”指的是和不指的有更具体的了解。

2
如何准确地验证CQRS命令并将其转换为域对象?
我一直在修改穷人的CQRS 1,因为我喜欢它的灵活性,可以在一个数据存储中存储细粒度的数据,这为分析提供了极大的可能性,从而增加了商业价值,并且在需要时还提供了另一种包含非规范化数据的读取以提高性能。 。 但是不幸的是,从一开始,我就一直在为应该在这种架构中放置业务逻辑的问题而苦苦挣扎。 据我了解,命令是传达意图的手段,它本身与域没有关系。它们基本上是数据(哑巴,如果需要的话)传输对象。这是为了使命令可以在不同技术之间轻松转移。对于成功完成的事件的响应,同样适用于事件。 在典型的DDD应用程序中,业务逻辑驻留在实体,值对象,集合根中,它们既包含数据又包含行为。但是命令不是域对象,因此命令不应仅限于数据的域表示形式,因为这会对它们造成很大的压力。 因此,真正的问题是:逻辑到底在哪里? 我发现我在尝试构建一个非常复杂的集合(该集合为它的值的组合设置一些规则)时往往最容易遇到这种斗争。另外,在对域对象建模时,我喜欢遵循快速失败范例,知道对象何时到达处于有效状态的方法。 假设聚合Car使用两个组件: Transmission, Engine。 两个Transmission和Engine值对象被表示为超级类型和具有根据子类型,Automatic和Manual传输,或Petrol与Electric分别引擎。 在此域中,完全依靠成功创建的Transmission,,Automatic或Manual或任意一种类型来生存Engine。但是Car聚合引入了一些新规则,这些规则仅在Transmission和Engine对象在同一上下文中使用时才适用。即: 当汽车使用Electric发动机时,唯一允许的变速箱类型是Automatic。 当汽车使用Petrol发动机时,可能有两种类型的发动机Transmission。 我可以在创建命令的级别上捕获这种违反组件组合的行为,但是正如我之前所说,据我所知,不应这样做,因为命令将包含业务逻辑,而业务逻辑应限于域层。 一种选择是将这种业务逻辑验证移至命令验证器本身,但这似乎也不对。感觉就像我将解构该命令,检查使用getter检索的属性,并在验证器中比较它们并检查结果。这让我尖叫得像是违反了得墨meter耳的法律。 放弃提到的验证选项,因为它似乎不可行,似乎应该使用该命令并从中构造聚合。但是这种逻辑应该在哪里存在?是否应该在负责处理具体命令的命令处理程序中?还是应该在命令验证器中(我也不喜欢这种方法)? 我当前正在使用命令,并在负责的命令处理程序中从中创建一个聚合。但是,当我执行此操作时,如果我有一个命令验证器,它将根本不包含任何内容,因为如果该CreateCar命令存在,则它将包含我知道在单独的情况下有效的组件,但集合可能表示不同。 让我们想象一个混合了不同验证过程的场景-使用CreateUser命令创建一个新用户。 该命令包含Id将要创建的一个用户及其Email。 系统为用户的电子邮件地址规定以下规则: 必须是唯一的 不能为空, 最多包含100个字符(数据库列的最大长度)。 在这种情况下,即使有一个唯一的电子邮件是一条业务规则,但对其进行汇总检查几乎没有任何意义,因为我需要将系统中的全部当前电子邮件加载到内存中,并在命令中检查该电子邮件(Eeeek!某物,某物,性能)。因此,我将此检查移至命令验证程序,该程序将UserRepository作为依赖项,并使用存储库来检查是否存在使用命令中存在电子邮件的用户。 当涉及到这一点时,突然将其他两个电子邮件规则也放入命令验证器中是有意义的。但是我觉得规则应该确实存在于User聚合中,并且命令验证程序应该只检查唯一性,如果验证成功,我应该继续在中创建User聚合CreateUserCommandHandler并将其传递到要保存的存储库中。 我之所以这样,是因为存储库的save方法很可能会接受一个聚合,该聚合可确保一旦传递了聚合,所有不变量都将得到满足。当逻辑(例如,非空性)仅出现在命令验证本身中时,另一位程序员可以完全跳过此验证,并直接UserRepository使用User对象调用对象中的save方法,这可能导致致命的数据库错误,因为电子邮件可能包含太久了。 您个人如何处理这些复杂的验证和转换?我大多对自己的解决方案感到满意,但是我觉得我需要肯定的是,我对自己的选择并不满意,但我的想法和方法并不完全愚蠢。我完全接受完全不同的方法。如果您有自己尝试过的东西并且为您做得很好,我很乐意看到您的解决方案。 1作为负责创建RESTful系统的PHP开发人员,我对CQRS的解释与标准的异步命令处理方法略有不同,例如有时由于需要同步处理命令而从命令返回结果。

7
业务对象-容器还是功能?
这是我在SO上问过的一个问题,但在这里可能会得到更好的讨论... 在我工作的地方,我们已经在这个问题上来回多次,正在寻找健全性检查。问题是:业务对象应该是数据容器(更像DTO),还是应该包含可以对该对象执行某些功能的逻辑。 示例-以一个客户对象为例,它可能包含一些通用属性(名称,ID等),该客户对象是否还应包含函数(保存,计算等)? 一条推理路线说将对象与功能(单一责任主体)分开,并将功能放在业务逻辑层或对象中。 另一道理说,不,如果我有一个客户对象,我只想调用Customer.Save并完成它。如果使用该对象,为什么需要了解另一个类来节省客户? 我们的最后两个项目已将对象与功能分开,但是关于新项目的争论再次出现。 哪个更有意义,为什么?

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而更喜欢存储过程?

6
计算上不可能的业务问题的例子是什么?
我有一位同事拒绝接受图灵机(以及扩展的冯·诺伊曼机)无法解决其自身的停机问题这一事实,他指出: 您可以花足够的时间和金钱来做任何事情。 他还不喜欢以下理论问题: 在我们的领域中,我们永远不会遇到这些问题。我们是应用程序开发人员,而不是理论科学家。 是否有一个很好的例子说明我无法用计算机来使他信服的商业问题?

4
厚实模型与 业务逻辑,您在哪里区分?
今天,我与组织中的另一位开发人员进行了激烈的辩论,讨论在何处以及如何向数据库映射的类中添加方法。我们使用sqlalchemy,并且数据库模型中现有代码库的主要部分不过是一袋带有类名的映射属性,几乎是从数据库表到python对象的机械翻译。 在论点中,我的立场是使用ORM的主要价值是可以将低级行为和算法附加到映射的类。模型首先是类,其次是持久性的(使用文件系统中的xml可以持久性,您无需关心)。他的观点是,任何行为都根本就是“业务逻辑”,并且必然属于持久性模型之外的任何地方,而持久性模型仅用于数据库持久性。 我当然确实认为,什么是业务逻辑,应该分开,因为它与实现方法的较低层和域逻辑之间存在一定的区别,我认为这是模型类提供的抽象。在上一段中讨论过,但是我很难理解那是什么。我对API可能有什么更好的理解(在我们的例子中是HTTP“ ReSTful”),因为用户以他们想做的事情调用API,这与他们被允许做的事情以及如何做不同。完成。 tl; dr:使用ORM时,可以或应该在映射类的方法中进行哪些操作,应该忽略哪些内容以驻留在另一层抽象中?


2
将编程业务逻辑与非IT人员配对
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 您在编码过程中是否有非IT人员与程序员合作的经验? 这就像结对编程一样,但是一个人是一个非IT人员,对业务有很多了解,也许是一个具有数学背景的流程工程师,他知道事物是如何计算的并且可以理解非惯用的程序代码。 我发现非IT工程师很容易理解某些过程性领域特定语言,例如PL / SQL。这些人最终成为代码的共同作者,并保证公式,因子等的正确性。 我发现这种成对编程非常有效率,这种工程类型的用户认为他们也是代码的“所有者”和“作者”,并有助于最大程度地减少沟通过程中的误解。他们甚至帮助设计测试用例。 这种做法常见吗? 它有名字吗? 您有类似的经历吗?

3
使用静态类型检查来防止业务错误
我非常喜欢静态类型检查。它可以防止您犯以下愚蠢的错误: // java code Adult a = new Adult(); a.setAge("Roger"); //static type checker would complain a.setName(42); //and here too 但这并不能阻止您做出如下愚蠢的错误: Adult a = new Adult(); // obviously you've mixed up these fields, but type checker won't complain a.setAge(150); // nobody's ever lived this old a.setWeight(42); // a 42lb adult would …

4
数据访问层中的业务对象
因此,我一直在通过TDD创建数据访问层,并且有些担心。我宁愿不走错误的道路,所以我想让你们看看我的想法是否符合干净的体系结构。 我的数据访问层(简称DAL)中的方法非常简单。它们与数据库中的存储过程一致(没有其他方法可以使数据库保持干净),并且它们包含与存储过程相同的参数。然后,他们仅连接到数据库,并返回查询结果。这是一个例子: public int DeleteRecord(int recordId) { recordId.RequireThat("recordId").NotZeroOrLess(); List<SqlParameter> parameters = new List<SqlParameter>(); parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId}); return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray()); } 这对于这种类型的方法非常有效,因为我对结果集没有做任何有意义的事情。我只想确保命令有效,所以我将返回非查询的结果,该查询只是受影响的行,并且我可以使用该数字来验证逻辑。 但是,在另一种DAL方法中,我想加载一条记录。我的加载过程将selects针对一堆表执行并返回a DataSet,但是我正在努力解决DAL是否应该使用来在方法内创建Business Objects的问题DataSet,或者我的Business Objects本身是否应该具有Load()获取该方法的方法的问题。DataSet然后从DAL开始,然后基本完成 通过DAL进行操作会导致业务对象中的逻辑更少(即使这只是选择逻辑,仍然是逻辑),但是会使DAL有点拥挤,使人感觉它确实在做它不应该做的事情。做。 你们有什么感想?

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.