Лучший способ выставить API из библиотеки - PullRequest
1 голос
/ 13 октября 2011

Я проектирую библиотеку Win32 для синтаксического анализа содержимого файла (столбцы и значения) и его внутреннего хранения в структуре данных (карта). Теперь мне нужно предоставить API, чтобы потребитель мог вызывать эти API для получения результатов.

Файл может иметь разные форматы, например, FM1, FM2 и т. Д. Потребитель может запросить, например,

FM1Provider.GetRecords("XYZ");
FM2Provider.GetRecords("XYZ");

То, что я планирую сделать, - это иметь класс CParser, который будет выполнять весь анализ и выставлять класс.

CParser
{
  bool LoadFile(string strFile);
  Map<string,string> GetFM1Records(string key);
  Map<string,string> GetFM1Records(string key);
};

или

   class CResultProvider
   {
     virtual Map<string,string> GetRecords(string key)=0;
   }

   class CFM1ResultProvider : public CResultProvider
   {
      Map<string,string> GetRecords(string key);
   }

   class CFM2ResultProvider : public CResultProvider
   {
      Map<string,string> GetRecords(string key);
   }

   CParser
   {
      bool LoadFile(string strFile);
      CResultProvider GetFM1ResultProvider();
      CResultProvider GetFM1ResultProvider();
   };

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

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

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

Я бы посоветовал предоставить парсеру только обратные вызовы для проанализированных данных.Таким образом, пользователь может выбрать наиболее подходящий контейнер для своего приложения или может применить и отбросить считанные данные без сохранения.вместо префикс ваших классов с C .

1 голос
/ 13 октября 2011

Предполагая, что клиенту нужно будет всего лишь один раз вызвать GetRecords, а затем поработать с картой, первый подход. Я предпочитаю первый подход, потому что он проще.

Если клиенту необходимо перезагрузить карту в разных местах своего кода, второй подход предпочтительнее, поскольку он позволяет клиенту писать свой код для одного интерфейса (CResultProvider). Таким образом, он может легко переключать формат файла, просто выбирая другую реализацию (в его коде должно быть ровно одно место, где выбрана реализация).

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