Это хороший дизайн? - PullRequest
2 голосов
/ 19 марта 2010

Хотелось бы узнать, что вы думаете об этой части нашей программы:

В нашей базе данных есть список кемпингов.

Партнеры звонят нам, чтобы получить все кемпинги рядом с местоположением GPS или все кемпинги, которые предоставляют бар (мы называем это услугой).

Так как я это понял?

Вот наша база данных:

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 Ответ

3 голосов
/ 19 марта 2010

Выглядит достаточно ясно, и, вероятно, будет работать. Он немного отличается от шаблона Query Object (см. Фаулер, Мартин. Шаблоны архитектуры предприятия . Addison Wesley, 2003), но не слишком далеко.

У него есть класс с именем Query, который имеет коллекцию объектов Criterion.

Объекты Criterion будут иметь оператор, поле и значение фильтра для фильтрации (в 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
    }
}

У объекта Query будет ваш базовый запрос:

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 {

    }

}

Оттуда должна быть служба, которая будет принимать запрос и выполнять работу с базой данных.

Это поставит вас в положение, когда переход к инструменту ORM будет немного менее трудным, когда вы доберетесь до этой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...