如何说服我的同事不要使用数据集进行企业开发(.NET 2.0+)

StackOverflow https://stackoverflow.com/questions/37378

  •  09-06-2019
  •  | 
  •  

与我一起工作的每个人都痴迷于以数据为中心的企业开发方法,并且讨厌使用自定义集合/对象的想法。说服他们的最佳方法是什么?

有帮助吗?

解决方案

如果您正在处理遗留代码(例如,从 .NET 1.x 移植到 2.0 或 3.5 的应用程序),那么脱离数据集将是一个坏主意。为什么要改变已经有效的东西?

但是,如果您要创建新应用程序,则可以引用以下内容:

  • 呼吁体验 疼痛 维护坚持数据集的应用程序
  • 列举新方法的性能优势
  • 用一个好的中间立场来引诱他们。迁移到 .NET 3.5,并提升 LINQ to SQL,例如:虽然仍然坚持数据驱动的架构,但与字符串索引数据集是一个巨大的背离,并且强制执行......瞧!自定义集合——以一种对他们隐藏的方式。

重要的是,无论你使用什么方法,你都保持一致,并且你对你的方法的优点和缺点完全诚实。

如果所有其他方法都失败了(例如,您的开发团队完全拒绝放弃旧的做法,并且对学习新事物持怀疑态度),那么这是一个 非常非常明显的标志 你的团队已经无法适应你的发展,是时候离开你的公司了!

其他提示

以身作则,谨慎行事。任何更强的东西只会让你与团队的其他成员疏远。

请记住考虑他们可能发现了您错过的东西。成为团队的一员意味着轮流学习和教学。

没有一个人能知道所有的答案。

请记住考虑他们可能发现了您错过的东西。成为团队的一员意味着轮流学习和教学。

借调了。“企业发展”在某种程度上不同于(通常其含义是“比”更重要)的整个想法,这真的让我很恼火。

如果使用某种技术确实有好处,那么您需要列出一份经过深思熟虑的清单,列出如果您更换技术可能会出现的所有优点和缺点。
向您的同事展示此列表以及每个列表的解释和示例。

创建此列表时必须现实一点。你不能只是说“为我们节省了很多时间!!!胜利!!”,但没有解决有时需要更多时间、需要 X 个月才能跟上新技术等问题的事实。你必须展示具体的例子,它可以在哪些方面节省时间,以及如何节省时间。

同样,你不能忽视缺点,就好像它们不重要一样,你的同事 将要 打电话给你。
如果你不做这些事情,或者被认为只是在推动你个人喜欢的事情,那么没有人会认真对待你,你只会被认为是一个充满热情和活力但一无所知的人关于任何事情。

顺便提一句。留意这个特殊的骗局。它会压倒一切,除非你有 很多 所有其他内容的有力案例:

  • 需要 12 个多月的时间来移植我们的现有代码。你输了。

当然,“这要看情况”。有时,数据集或数据表更适合,例如它确实是相当轻的业务逻辑、实体/记录的平面层次结构,或者具有某些版本控制功能。

当您想要实现自定义对象集合时,自定义对象集合会大放异彩 深层层次结构/图表 无法在平面 2D 表中有效表示的对象。您可以演示的是一个大型对象图,并让某些事件沿着正确的分支传播,而不会调用其他分支中的不适当的对象。这样,就不需要循环或选择每个 DataTable 来获取子记录。

例如,在我两年半前参与的一个项目中,有一个 UI 模块应该在单个 WinForms DataGrid 中显示问题和答案控件(更具体地说,它是 Infragistics 的 UltraGrid)。一些更棘手的要求

  • 问题的答案控制可以是 任何事物 - 文本框、复选框选项、单选按钮选项、下拉列表,甚至弹出一个可以从 Web 服务提取更多数据的自定义对话框。
  • 根据用户回答的内容,它可以触发更多子问题直接出现在父问题下方。如果稍后给出不同的答案,则应该公开与该答案相关的另一组子问题(如果有)。

最初的实现完全是用数据集、数据表和数组编写的。循环遍历多个表的数百行的数量纯粹是令人费解的。它对来自 C++ 背景的程序员试图 参考 一切(你好,生活在堆中的对象使用 参考变量, ,就像指针一样!)。没有人,甚至最初的程序员,可以解释为什么代码会这样做。六个月后我才进入现场,但那里仍然充满了错误。难怪我接手的第二代开发人员决定退出。

我花了两个月的时间来解决这个混乱的问题,我自己将整个模块重新设计成一个 面向对象图来解决这个问题. 。是的,包括抽象类(根据问题类型在网格单元上呈现不同的答案控制)、委托和事件。最终结果是一个绑定到深层问题层次结构的 2D 数据网格,并根据父子排列自然排序。当父级问题的答案发生更改时,它会向子级问题引发一个事件,并且子级问题将根据父级的答案自动显示/隐藏网格中的行。只有该路径上的问题对象受到影响。与旧方法相比,该解决方案的 UI 响应能力提高了几个数量级。

讽刺的是,我想提出一个与此完全相反的问题。与我共事的大多数程序员都采用了自定义数据对象/集合方法。看到有人在一台显示器上打开 SQL Server 表定义,然后在另一台显示器上慢慢地在 Visual Studio 中键入匹配的行包装类(包含每列的私有属性和 getter-setter),这让我很伤心。如果他们还倾向于创建 60 列的表,那就尤其痛苦。我知道有一些 ORM 系统可以自动构建这些类,但我发现手动方法的使用频率要高得多。

工程选择总是涉及可用选项的优缺点之间的权衡。以数据集为中心的方法有其优点(实际数据库数据的类似于数据库表的内存中表示,由知道自己在做什么的人编写的类,为大量开发人员所熟悉等),自定义数据对象也是如此(编译类型检查,用户无需学习SQL等)。如果公司中的其他人都采用 DataSet 路线,那么至少从技术上来说,DataSet 可能是他们所做工作的最佳选择。

数据集/表格并没有那么糟糕,不是吗?

我能给出的最好建议是在自己的代码中尽可能多地使用它,并希望通过同行评审和错误修复,其他开发人员将看到代码如何变得更具可读性。(确保在发生这些情况时推动要点)。

最终,如果代码有效,那么剩下的就是语义了,这是我的观点。

我想你可以尝试推销 O/R 映射和映射器工具的想法。将行视为对象的好处非常强大。

我认为你应该专注于表演。如果您可以创建一个应用程序来显示使用数据集与自定义实体时的性能差异。另外,尝试向他们展示领域驱动设计原则以及它如何与实体框架相适应。

不要把它变成宗教或信仰的讨论。这些很难赢得(而且也不是你想要的)

不要像您刚才在问题中所做的那样来构建它。问题不在于让任何人同意这种方式或那种方式是他们应该工作的一般方式。您应该讨论每个人需要如何思考才能在任何特定时间做出正确的选择。举例说明何时使用 dataSet,何时不使用。

我让开发人员使用数据表来存储他们从数据库中获取的数据,然后使用该数据表来编写业务逻辑代码......我向他们展示了我如何减少加载页面的时间,从占用 100% CPU(在 Web 服务器上)的 7 秒到根本看不到 CPU 线移动。通过将内存对象从 dataTable 更改为 Hash 表。

因此,举一个例子或案例,你的想法可以更好地以不同的方式实施,并赢得这场战斗。不要打高水平的战争...

如果互操作性是/将成为一个问题,那么 DataSet 绝对不是正确的方向。您可以通过服务公开数据集/数据表,但是否应该或值得商榷。如果您正在谈论 .NET->.NET,那么您可能没问题,否则您将会有一个非常不高兴的客户端开发人员从另一边使用您的服务

否则你无法说服他们。选择较小的挑战或转移到不同的组织。如果你的经理尊重你,你会看看你是否可以以领域驱动的方式做一个项目作为一种技术试验。

如果您可以分析,就去做并分析。数据集比简单的数据集更重 Collection<T>

数据读取器比使用适配器更快......

改变对象的行为比修改数据集容易得多

反正:就去做吧,请求宽恕而不是许可。

大多数程序员不喜欢偏离他们的舒适区(请注意,“大多数程序员”集和“Stack Overflow”集的交集可能是空集)。“如果它以前有效(或者刚刚有效),那么就继续这样做”。我目前正在进行的项目需要大量的论证才能让老程序员使用 XML/模式/数据集而不仅仅是 CSV 文件(以前版本的软件使用 CSV)。它并不完美,模式在验证数据方面不够强大。但这是朝着正确方向迈出的一步。我开发的代码在数据集上使用面向对象的抽象,而不是传递数据集对象。一般来说,最好以身作则,一次一小步。

这里已经有一些非常好的建议,但如果你所需要的只是 stackoverflow 上的一些支持性评论,那么你仍然需要说服你的同事。而且,如果他们像听起来一样持怀疑态度,那么你将需要更多弹药。首先,获取 Martin Fowler 的“企业架构模式”,其中包含对各种数据访问技术的详细分析。阅读。然后强迫他们都读。

任务完成。

以数据为中心意味着更少的代码复杂性。

自定义对象意味着可能需要组织、维护和通常使用数百个额外对象。它也会快一点。

我认为这实际上是一个代码复杂性与性能的问题,可以通过应用程序的需求来回答。

从小处开始。有没有一个实用的应用程序可以用来说明你的观点?

例如,在我工作的地方,主应用程序有一个复杂的构建过程,涉及更改配置文件、安装服务等。

所以我编写了一个应用程序来自动化构建过程。它有一个基本的 WinForms UI。但由于我们转向 WPF,我将其更改为 WPF UI,同时保留了 WinForms UI,这要归功于模型-视图-演示器。对于那些不熟悉 Model-View-Presenter 的人来说,这是一个可以参考的易于理解的示例。

同样,找到一些小东西,您可以向他们展示非 DataSet 应用程序的外观,而无需进行重大的开发投资。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top