zoukankan      html  css  js  c++  java
  • 关于ORM的一点思考

    1、为什么使用ORM
       1)无SQL

       i.  为了证明SQL的正确性,也许我们要把SQL语句粘贴到数据库中,运行一下——当然,经历过一段时间的SQL磨练之后,肉眼能看出大多数SQL中的错误

       ii. 各个数据库,还不完全一样


       2)业务是变化的

       i.  同一个程序,也许随着时间的变化,业务也在发生着变化。以前用到的,现在不用了;现在在用的,以前没发现。

       ii. 这个软件在A公司做了,到B公司,哎,不错,给我们也做一个吧,主要就是把这个地方、这个地方和这个地方改改,应该很简单吧——旁边插不上话的程序员,在心里恨着:“说得简单!”——如果你觉得简单,说明你还没经历过,看起来几个字段的增减,却可能在N个地方都会出现问题——你会觉得这设计做得太差了吧,但实际上大多数软件,就是这么高度的耦合着

      

        3)最根本的:我添加一个字段,我不希望界面、逻辑、数据库都要仔细查找一遍——我希望能够知道,只有一个或者几个确定的地方会需要改动,怎么改动——程序员怕什么?怕自信满满的告诉项目经理,某某问题改好了。一提交测试,却告诉你,更多问题出现。

    2、我们需要实体吗?

        答案是未必!如果一张表里的信息,我们只是简单的存储、展现一下,需要通过实体取值、赋值做什么?

        数据库的数据,是一种值键关系,展现在我们页面上的表单,也是一种值键关系。如果我们中间加一个实体转换,我们不得不:

            //从数据库取数据

            A.A1 = db.Get("A1");//或许你还需要强制转换一下

            A.A2 = db.Get("A2");

            //展示数据

            控件A1.Text = A.A1;//或许你还需要.ToString()

            控件A2.Text = A.A2;

        但如果直接是:

            FindControl("控件A1").Text = db.Get("A1");

        这时则有可能批量对控件进行赋值

            foreach(列 in db)

            {

                 FindControl(列).Text = db.Get(列);

            }

        这个时候,加入一个实体类,对程序反而是让操作变得烦琐——如果字段上百,你就知道,原来混点工资这么简单,在visual studio不停的敲"."就可以。

        (代码生成工具?嗯,是可以的——但是在做代码生成工具之前,我希望你先把代码写得更优雅点)

    3、计算机关心什么?

        从上面的例子我们知道, 计算机才不关心你是用实体还是其它呢,计算机关心的是正确的、全面的信息。

        所以,如果你写了个100多个属性的实体类,但这其中99个都只是赋值、取值操作(不需要根据该值做任何判断),那你用一个Hashtable,给计算机也是一样的——一个属性,取代了100个属性

    3、我们不需要实体吗?

        if(db.Get("A1")==1) DoSth1();

        else if(db.Get("A1")==2) DoSth2();

        每当写下这样的代码的时候,我的内心都感到忐忑不安,我害怕以下几件事发生:

        1) 某天,一个维护人员看到 "A1" 这个字段名不爽,三下五去二,就把名字给换掉了

        2) 某天,客户打来电话说,直接在数据库中,把A1的状态改为2吧,我生怕 db.Get("A1")==1时,有些事情没做,结果数据库中改成状态2,做不下去

        3) 某天,程序的后期维护人员打电话找到我,弱弱的问:那个1、2分别代表什么意思。我问:什么1、2?让我看看。结果看了半天,自己也没看懂。

        ...

        最怕的是有一天,经理走过来说,把这个程序“稍微”改改。

        所以,我们还是需要实体定义,写出的代码,还是要给人看的——从事编码几年之后,才知道,一个程序员主要时间还是在修改原来的代码,而不是全新的创作。

       

    4、写代码的人,究竟关心什么?

         所以,我们知道,做为给人看的代码,并不需要把实体的每个属性逐一进行赋值、取值。

         写代码的人,关心的是,哪些字段需要进行业务上的判断。

         而对于这些需要判断的字段,我希望不会随便更改。

         如果必要要更改,我也希望能在更改的时候,编译器就能告诉我哪些地方使用了这个。

        

    5、如何平衡?

         办法应该不是唯一的。

         我想到的一个简易的办法就是所有实体继承自一个基类,大概是这样

              public class EntityBase

              {

                      Dictionary<string, object> values = new Dictionary<string, object>();

                      public object this[string name]{get{return values[name];}set{values[name]=value;}}                 

              }

              而具体的实体,可能是这样子

              public class Student:EntityBase

              {

                     public DateTime Birthday{get{return (DateTime)this["Birthday"];} set{this["Birthday"] = value;}}

              }

              而使用可能是这样子的

              Student stu = db.GetEntity<Student>();

              if(stu.Birthday.Day == DateTime.Now.Day) {Show("今天是您的生日");}

      

  • 相关阅读:
    「BZOJ 1297」「SCOI 2009」迷路「矩阵乘法」
    「BZOJ 1831」「AHOI 2008」逆序对「贪心」
    「BZOJ 1791」「IOI 2008」Island「基环树」
    WC2019 冬眠记
    「ZOJ 1354」Extended Lights Out「高斯消元」
    「BZOJ 3270」博物馆「高斯消元」
    「学习笔记」泰勒级数
    获取iPhone的UDID
    面试题
    Java的post(HTTPS)请求-----接口测试
  • 原文地址:https://www.cnblogs.com/binblog/p/1945455.html
Copyright © 2011-2022 走看看