业务对象、验证和异常

2024-01-10

我一直在阅读一些有关异常及其使用的问题和答案。似乎有一种强烈的观点认为,仅应针对异常、未处理的情况提出异常。因此,这让我想知道验证如何与业务对象一起工作。

假设我有一个业务对象,其中包含对象属性的 getter/setter。假设我需要验证该值是否在 10 到 20 之间。这是一条业务规则,因此它属于我的业务对象。所以这对我来说似乎意味着验证代码进入我的设置器中。现在我将 UI 数据绑定到数据对象的属性。用户输入 5,因此规则需要失败,并且不允许用户移出文本框。 。 UI 数据绑定到属性,因此将调用 setter、检查规则并失败。如果我从业务对象中引发异常,表明规则失败,UI 会接收到该异常。但这似乎违背了异常的首选用法。考虑到这是一个二传手,你实际上不会得到二传手的“结果”。如果我在对象上设置另一个标志,则意味着 UI 必须在每次 UI 交互后检查该标志。

那么验证应该如何进行呢?

编辑:我可能在这里使用了一个过于简化的示例。像上面的范围检查这样的事情可以通过 UI 轻松处理,但是如果验证更复杂怎么办?业务对象根据输入计算一个数字,如果计算出的数字超出范围,则应拒绝该数字。这是更复杂的逻辑,不应该出现在 UI 中。

还考虑根据已输入的字段输入进一步的数据。例如,我必须在订单上输入一个商品才能获取某些信息,例如现有库存、当前成本等。用户可能需要此信息来决定进一步输入(例如要订购多少单位),或者订单中可能需要此信息以便进一步验证。如果该项目无效,用户是否应该能够输入其他字段?重点是什么?


你想深入研究一下保罗·斯托维尔 http://www.paulstovell.com/关于数据验证。他曾一度总结自己的想法本文 http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspx。我碰巧同意他对此事的看法,我在我自己的图书馆 http://salamanca.nourysolutions.com/road/index.php?post/2008/08/26/Inside-the-libraries-I-%3A-Data-Rules.

用 Paul 的话说,这里是在 setter 中抛出异常的缺点(基于一个示例,其中Name属性不应为空):

  • 有时您可能实际上需要一个空名称。例如,作为默认值“创建一个帐户” form.
  • 如果您在保存之前依赖于此来验证任何数据,您将错过数据已经无效的情况。我的意思是,如果您从数据库加载一个空名称的帐户并且不更改它,您可能永远不知道它是无效的。
  • 如果您不使用数据绑定,则必须使用以下内容编写大量代码try/catch块向用户显示这些错误。当用户填写表单时尝试在表单上显示错误变得非常困难。
  • 我不喜欢为非异常的事情抛出异常。用户将帐户名称设置为“超级加州脆弱性Expialidocious”不是异常,而是错误。当然,这是个人的事情。
  • 这使得获得所有已被违反的规则的列表变得非常困难。例如,在某些网站上,您会看到验证消息,例如“必须输入姓名。必须输入地址。必须输入电子邮件”。为了显示它,你将需要很多try/catch blocks.

以下是替代解决方案的基本规则:

  1. 拥有无效的业务对象并没有什么问题,只要您不尝试保留它。
  2. 任何和所有损坏的规则都应该可以从业务对象中检索,以便数据绑定以及您自己的代码可以查看是否存在错误并进行适当的处​​理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

业务对象、验证和异常 的相关文章

  • .Net Core 中 String 默认不可序列化吗?

    我正在查看其他的 Fortify 静态分析安全测试 SAST 扫描报告 以识别和抑制误报 应用程序框架是C NET Core SAST 报告部分内容如下 Method1 在第 111 行将不可序列化的对象存储为 HttpSessionSta
  • 更改 Visual Studio 2015 扩展中项目内的文件 ProjectItem 的内容?

    如何更改文件的内容 ProjectItem在给定的范围内Project 我想用字符串替换它的所有内容 这个问题有解决办法吗 我想做一些改变ProjectItem CS 文件 通过使用 VSIX 包 以及我现在看到的唯一一种执行此操作的方法
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • Ruby 解释器嵌入到 C 代码中

    我只是尝试书中的一个简单例子 我有一个 sum rb 文件 class Summer def sum max raise Invalid maximum max if max lt 0 max max max 2 end end 还有一个
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • 使用 std::string 导致 Windows“找不到入口点”[重复]

    这个问题在这里已经有答案了 当我用 G C C 编译它时 include
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 混合 VS2012 平台工具集

    我们正在从 VS2005 切换到 VS2012 update 2 我们正在构建大量 主要是控制台 本机 C 无 MFC ATL 可执行文件 它们使用几个常见的静态链接库 这些可执行文件主要在 Win7 计算机上运行 但有些也部署在较旧的 X
  • 输入缓冲区刷新

    考虑下面的代码 include
  • tcmalloc/jemalloc 和内存池之间有什么区别(以及选择的理由)?

    tcmalloc jemalloc是改进的内存分配器 还引入了内存池以更好地分配内存 那么它们之间有什么区别以及在我的应用中如何选择它们呢 这取决于您的程序的要求 如果您的程序有更多的动态内存分配 那么您 需要从可用的分配器中选择一个内存分
  • 在 C# 中使用 as 关键字与泛型类型发生冲突的编译时行为

    当尝试对无法转换为的非泛型类型使用 C as 关键字时 编译器会给出无法转换类型的错误 但是 当对泛型类型使用 as 关键字时 编译器不会给出错误 public class Foo public class Bar
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 可选参数代码在 .NET 3.5 中编译。为什么?

    这段代码在 VS 2010 的框架 3 5 项目中编译正常 我三次检查过 public LoggingClient string uri net msmq localhost logging 为什么 我在 C 4 规范中没有看到任何内容 文

随机推荐

  • 如何将目录中自动生成的文件列表添加到 JS 文件中?

    我正在用 HTML5 编写一个在线游戏 其中一个文件包含资源列表 这些资源全部位于resources img 文件夹 现在我希望根据此文件夹的内容自动生成此列表 而不必每次添加新图像时手动更新它 我很确定 Grunt 可以做到这一点 但我不
  • 系统安全异常?

    描述 应用程序试图执行安全策略不允许的操作 要授予此应用程序所需的权限 请联系您的系统管理员或在配置文件中更改应用程序的信任级别 异常详细信息 System Security SecurityException 请求 System Secu
  • 将使用react-router v5完成的BreadCrumb组件更改为react router v6

    我想更改使用react router v5完成的BreadCrumb组件以反应router v6 import React from react import Breadcrumbs as MUIBreadcrumbs Link Typog
  • MySQL动态交叉表

    我有一个这样的表 way stop time 1 1 00 55 1 2 01 01 1 3 01 07 2 2 01 41 2 3 01 47 2 5 01 49 3 1 04 00 3 2 04 06 3 3 04 12 我想要一个这样
  • 如何使用 RESTEasy 代理客户端发送查询参数映射

    我正在寻找一种将包含参数名称和值的映射传递到 GET Web 目标的方法 我期待 RESTEasy 将我的地图转换为 URL 查询参数列表 然而 RESTEasy 抛出一个异常说Caused by javax ws rs Processin
  • 递归构建分层 JSON 树?

    我有一个父子关系数据库 数据如下所示 但可以以您想要的任何方式呈现 字典 列表列表 JSON 等 links Tom Dick Dick Harry Tom Larry Bob Leroy Bob Earl 我需要的输出是一个分层 JSON
  • 处理文件名中的特殊字符时批量重命名问题

    我在 c files 中有数百个 mp3 文件 里面有所有可以想象到的文件名 例如 milad mp3 表现良好 嘿你 mp3 文件名中有空格 systemofadown mp3 长文件名 howdy 1 mp3 文件名中的括号 以及最后三
  • 将空图添加到构面,并与另一个构面组合

    Using this SO solution https stackoverflow com questions 30372368 adding empty graphs to facet wrap in ggplot2 I created
  • 可复制的 Coldfusion SQL 异常

    每当 CF 抛出错误时 我都会收到一封包含所有异常信息的电子邮件 每次涉及数据库错误时 我都会得到 SQL WHERE 和 QueryError 信息 这很好 SQL SELECT FooID FROM FooTable WHERE Foo
  • 从会话 Codeigniter 中回显用户

    我是 codeigniter 的新手 我已经实现了一个简单的登录系统 我想在我的视图页面上打印存储在会话中的用户名 这是我的控制器 class LoginController extends CI Controller function i
  • 通过触摸跳转 Unity C#

    我在 Unity C 上编写游戏 这是简单的跑步者 我有 Platformer2DUserControl 脚本 就这个 using UnityEngine using UnitySampleAssets CrossPlatformInput
  • 什么是编程语言? [复制]

    这个问题在这里已经有答案了 可能的重复 什么是计算机编程语言 https stackoverflow com questions 1325686 what is a computer programming language 不完全是 我一
  • 静态 Linkedhashmap 还是 Sharedpreference?

    Android 应用程序具有两种在活动之间传递数据的解决方案 请不要意图额外 public class A public static LinkedHashMap
  • 如何在jquery中右键单击添加dbclick()

    您好 我想在右键单击时使用 dblclick 因为谷歌地图必须放大和缩小 有什么办法可以做到这一点吗 我已经编写了 dblclick 但现在它只需要左键单击即可工作 有关如何执行此操作的任何指示 这是我的代码 div demo1 dblcl
  • Swift 仅针对某些错误类型组合重试

    我有一个自定义管道 我想对一些可恢复的错误代码进行 3 次重试 并且我想为可恢复的错误添加一些短暂的延迟 有人知道我该怎么做吗 func createRequest for message Message gt AnyPublisher
  • 编译期间未包含在目标中的 .h 文件会发生什么情况?

    我有一个 Common h 文件 其中存储了在我的项目中重复使用的所有字符串 namespace Common static const std string mystring IamAwesum 因此 在任何需要特定字符串的文件中 我都包
  • 哪些 std::async 实现使用线程池?

    使用的优点之一std async而不是手动创建std thread对象应该是std async可以在幕后使用线程池来避免超额订阅问题 但是哪些实现可以做到这一点呢 我的理解是微软的实现确实如此 但是其他的呢 async实施 Gnu 的 li
  • 使用 MapReduce 实施 PageRank

    我正在尝试解决使用 MapReduce 实现 PageRank 的理论问题 我有以下具有三个节点的简单场景 A B C 邻接矩阵在这里 A B C B A 例如 B 的 PageRank 等于 1 d N d PR A C A N numb
  • Matlab 中打印函数的 Ghostscript 错误

    我正在尝试使用 Matlab 保存图像print功能 myImage magic 500 myFigure figure visible off r 1 set myFigure PaperUnits inches PaperPositio
  • 业务对象、验证和异常

    我一直在阅读一些有关异常及其使用的问题和答案 似乎有一种强烈的观点认为 仅应针对异常 未处理的情况提出异常 因此 这让我想知道验证如何与业务对象一起工作 假设我有一个业务对象 其中包含对象属性的 getter setter 假设我需要验证该