Сложная программная архитектура - PullRequest
2 голосов
/ 02 октября 2009

У меня есть несколько вопросов об архитектуре программного обеспечения, над которым я работаю!

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

  • Социальные сети (Facebook, MySpace, ...),
  • Общие услуги (RSS, Mail, Twitter ...),
  • Социальные закладки (Digg, Delicious ...),
  • Чаты (MSN, AOL ...),
  • ...

В настоящее время архитектура выглядит так: Использование шаблонов проектирования MVC и Observer / Observable для взаимодействия между моделью (TApp_Core) и пользовательским интерфейсом.

TApp_Core
 TBookmarkingServices_Core
  TDelicious (implement IBookmarkingServices) 
  TDigg (implement IBookmarkingServices) 
  etc... (implement IBookmarkingServices) 
 TChatServices_Core 
  TMSN (implement IChatServices) 
  TGoogleChat (implement IChatServices) 
  TAOLChat (implement IChatServices) 
  etc... 
 TRSSServices_Core 
 ...

Таким образом, программное обеспечение создает экземпляр TApp_Core, а затем, в зависимости от выбора пользователя, создает некоторые экземпляры других служб (например, App_Core.BookmarkingServices_Core.AddServices (Digg, User, Password);).

Некоторые вопросы!

  • Считаете ли вы, что текущий дизайн программного обеспечения является правильным?
  • В настоящее время существует только один поток для всего программного обеспечения ... Было бы лучше создать новый поток для каждого запроса к службе? (например, TDigg получает сообщение от кнопки, создает поток, который создаст TidHTTP, сгенерирует запрос к серверу, дождется ответа, проанализирует ответ, отправит сообщение каждому наблюдателю (обратный вызов) и затем освободит нить.
  • Кажется, очень трудно связать все View / Controller с каждой частью модели, это нормально, что для этого требуется так много работы? Пример: чтобы отправить сообщение, например, используя Twitter, потребуется:
    • Присоединение контроллера (кнопки) к объекту TApp_Core.TMicrobloggingServices_Core.TTwiter (модель)
    • подождите, пока пользователь нажмет на кнопку
    • Отправить сообщение TTwiter (модель)
    • Создать тему для отправки запроса на сервер
    • Разобрать ответ с сервера
    • Выполнить обратные вызовы, чтобы уведомить, что запрос был выполнен, и дать результат
    • Освободите тему
  • Если я воспользуюсь предыдущей идеей, не создаст ли она слишком много потоков и сделает компьютер медленным и менее ответственным? За исключением случаев, когда я реализую пул потоков (но его довольно сложно использовать).
  • Достаточно ли хорош SQLite 3 для хранения всех данных на клиенте? (данные могут быть письмами, новостными лентами и т. д., поэтому со временем может быть довольно много данных).

Спасибо и извините за мой плохой английский!

Ответы [ 3 ]

4 голосов
/ 02 октября 2009

Считаете ли вы, что текущий дизайн программного обеспечения является правильным?

Вероятно, объективно «правильного» дизайна не существует - есть только лучшие или худшие дизайны. :) Похоже, вы на правильном пути, но я бы посоветовал вам оставить свой графический интерфейс и представления отделенными от серверных сервисов. Например:

     View --- Controller --- Service

Таким образом, View знает только, как отображать вещи (например, сообщения IM, веб-контент или что-то еще) и передает запросы от пользователя к Controller. Controller получает уведомления от Service и обновляет View. Service ничего не знает о внешнем интерфейсе (так что он может быть скриптовым, что очень полезно) и просто реализует протокол, необходимый для взаимодействия с сетевым сервисом. У вас будет отдельный набор этих трех классов для каждой отдельной серверной системы и общий контроллер для управления приложением на глобальном уровне.

Кажется, очень трудно связать все View / Controller с каждой частью модели, это нормально, что для этого требуется так много работы?

Вероятно, да - вы пытаетесь нетривиальное приложение. Я предполагаю, что вы используете архитектуру в стиле MVC. Это может потребовать больше работы, чтобы должным образом отделить вещи, но это определенно стоит того. Чем сложнее ваше приложение, тем больше вы выиграете от наложения и разделения.

Было бы лучше создать новый поток для каждого запроса к услуге?

Учитывая, что все сервисы основаны на сети, вам нужно помешать блокирующим вызовам ввода / вывода (таким как чтение сокетов) блокировать ваш основной поток графического интерфейса. Поэтому вам нужно либо использовать полностью асинхронный ввод-вывод с обратными вызовами в одном потоке (не очень часто), либо иметь отдельный поток для каждого сетевого сеанса (наиболее распространенный подход). Я бы не рекомендовал создавать новый поток для каждого отдельного запроса, но для всего сеанса. Вы должны быть осторожны, чтобы избежать обычных проблем с многопоточностью, таких как условия гонки и взаимоблокировки (эта тема может заполнить книгу). Поток должен будет отправить сообщение обратно в графический интерфейс для уведомлений, так как вы не можете обновить свой графический интерфейс из контекста другого потока.

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

Звучит так, будто ваш GUI соединен с контроллером и обработчиком протокола. Я предлагаю вам отделить интерфейс и бэк-энд и оставить все как есть.

Если я воспользуюсь предыдущей идеей, не создаст ли она слишком много потоков и сделает компьютер медленным и менее ответственным?

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

Достаточно ли хорош SQLite 3 для хранения всех данных на клиенте? (данные могут быть письмами, новостными лентами и т. д., поэтому со временем может быть много данных).

SQLite - отличная база данных для этой цели. Он используется некоторыми из крупнейших в мире компаний по разработке программного обеспечения для управления хранилищем на стороне клиента. Это очень быстро и эффективно, и я уверен, что оно сможет идти в ногу с вашим приложением.

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

0 голосов
/ 02 октября 2009

Я бы посоветовал перейти на платформу ORM, чтобы абстрагироваться от вашей базы данных. Это дает вам значимый уровень абстракции данных, а также означает, что вам не нужно беспокоиться о выборе базы данных. SQLite - это хорошая компактная база данных. Это может быть хорошо для тестирования. Но он, конечно, не собирается сокращать его в реальной многопользовательской среде (он имеет блокировку на уровне файлов, что, безусловно, сделает невозможным одновременное CRUD в любом значимом масштабе). Он также использует только подмножество SQL. Используйте и ORM, и вы можете легко изменить позже.

0 голосов
/ 02 октября 2009

Глядя на ваш пост, трудно решить, является ли ваша архитектура "хорошей" или нет. Вот к чему я стремлюсь

  • Это работает?
  • Сделайте минимум, чтобы он заработал.
  • Очистите свой дизайн, как вы идете.
  • Используйте инструменты для визуализации вашего дизайна.

Я считаю чрезвычайно полезным использовать такие инструменты, как NDepend для визуализации зависимости.

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