代码之家  ›  专栏  ›  技术社区  ›  remi bourgarel

这是一个面向对象的好设计吗?

  •  2
  • remi bourgarel  · 技术社区  · 14 年前

    我们的数据库里有露营地的清单。

    Campsite
    - ID
    - NAME
    - GPS_latitude
    - GPS_longitude
    
    CampsiteServices
    -Campsite_ID
    -Services_ID
    

    所以我的代码(c#但是它不相关,假设它是一种OO语言)是这样的

    public class SqlCodeCampsiteFilter{
      public string SqlCode;
      public Dictionary<string, object> Parameters;
    }
    
    interface ISQLCampsiteFilter{
       SqlCodeEngineCore CreateSQLCode();
    }
    
    public class GpsLocationFilter : ISQLCampsiteFilter{
      public float? GpsLatitude;
      public float? GpsLongitude;
       public SqlCodeEngineCore CreateSQLCode()
              {
        --return an sql code to filter on the gps location like dbo.getDistance(@gpsLat,@gpsLong,campsite.GPS_latitude,campsite.GPS_longitude) with the parameters
      }
    }
    public class ServiceFilter : : ISQLCampsiteFilter{
      public int[] RequiredServicesID;
       public SqlCodeEngineCore CreateSQLCode()
              {
        --return an sql code to filter on the services "where ID IN (select CampsiteServices.Service_ID FROm CampsiteServices WHERE Service_ID in ...)
      }
    }
    

    所以在我的网络服务代码中:

    List<ISQLFilterEngineCore> filters = new List<ISQLFilterEngineCore>();
    if(gps_latitude.hasvalue && gps_longitude.hasvalue){
      filters.Add (new GpsLocationFilter (gps_latitude.value,gps_longitude.value));
    }
    if(required_services_id != null){
      filters.Add (new ServiceFilter (required_services_id ));
    }
    string sql = "SELECT ID,NAME FROM campsite where 1=1"
    foreach(ISQLFilterEngineCore aFilter in filters){
      SqlCodeCampsiteFilter code = aFilter.CreateSQLCode();
      sql += code.SqlCode;
      mySqlCommand.AddParameters(code.Parameters);//add all the parameters to the sql command
    }
    return mySqlCommand.GetResults();
    

    1) 我不使用ORM的原因很简单,因为这个系统已经存在了10年,而且从一开始就在这里的唯一一个开发人员已经开始了解公共和私有的区别。
    2) 我不喜欢SP,因为:我们可以重写,而t-sql使用起来就不那么有趣了:)

    如果有什么不清楚,请询问

    1 回复  |  直到 14 年前
        1
  •  3
  •   Matthew Flynn    14 年前

    看起来相当清楚,可能有用。它与查询对象模式稍有不同(参见Fowler,Martin)。 企业架构模式 . 艾迪生·韦斯利,2003),但离得不远。

    这有一个名为Query的类,它有一个criteria对象的集合。

    Criteria对象将具有要筛选的运算符、字段和筛选器值(在Java中,对不起):

    Class FloatCriterion implements Criterion {
        String _operator;  // = "="
        String _fieldName; // = "GPS_latitude"
        Float _value;     // = 43.21
    
        String getSql(){
            // build the where criteria
        }
        Param  getValue(){
            // return the param value
        }
    }
    

    查询对象将具有您的基本查询:

    Class CampsiteQuery implements Query {
        String _baseQuery = "SELECT ID,NAME FROM campsite where 1=1"
        Collection<Criteria> _criteria;
    
        void addCriterion(Criterion crit) {
            _criteria.add(crit);
        }
    
        String buildSql{
            // concat _baseQuery with each Criterion.getSql
        }
    
        List<Param> getParams {
            // build list of params from criteria
        }
    
        List<Campsite> get Results {
    
        }
    
    }
    

    从那里应该有一个服务,它将接受一个查询并执行与数据库对话的工作。