2013-03-25 3 views
1

Я знаю, что существует множество вопросов о том, когда использовать или не использовать статические поля и методы в объектно-ориентированном программировании, но большинство примеров сводится к использованию Math.Pi или подобных упрощенных примеров.Эффективное использование статических полей и методов в классе? Инициализируется в конструкторе или в декларации? Мне нужно руководство

У меня серьезный недостаток в качестве программиста, и это связано с тем, что моя инвалидность соответствует программированию ООП в целом, я думаю. Если бы это зависело от меня, я бы использовал функциональный подход ко многим из моих программ, но мои коллеги-программисты не всегда согласны.

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

Моя основная проблема заключается в том, что я не понимаю, как наилучшим образом использовать системные ресурсы при использовании ООП в C#. Я не могу визуализировать распределение памяти и поток выполнения при введении статических полей и методов в мои классы и когда объявлять ресурс как статический или нестатический.

Итак, это краткое объяснение моей проблемы под рукой:

мне нужно разработать «программу», которая синхронизирует информацию между двумя отключенными системами. «Система 1» работает с «Билетами», содержащими информацию об ошибках, сообщенных клиентами и проверенных тестировщиками. Я могу получить доступ к содержимому Билета в виде объектов через запрос Linq в базу данных SQL через .NET Framework Entity Framework.

«Система 2» работает с рабочими элементами, которые необходимо создать на основе билета «Система 1». «Утилита» должна синхронизировать эту информацию, и ее можно было бы изменить с обеих систем. Поэтому мне нужно сохранить информацию о состоянии разных объектов, которые сохраняются между прогонами программы.

Таким образом, я использую базу данных «System 1» (только для чтения) для создания локальных объектов, которые соответствуют требованиям «Системы 2» для создания начальных рабочих элементов и хранения локальных объектов посредством двоичной сериализации, поэтому я могу создать новый список в следующем запуске и сравнить значения локально и избежать ненужной загрузки сети и сервера, а затем обновить системы через их соответствующие API.

Хотя у меня есть рабочее решение для этого, я не уверен, что он работает эффективно. У меня есть класс (LocalTicket) и класс (LocalWorkItem), который используется для хранения состояния между запусками, но класс LocalTicket использует соединение с базой данных для сбора информации о билетах, и я объявил статический список для хранения значений из сервер для сравнения с локальными объектами. Я не инициализирую список перед вводом конструктора для первого объекта LocalTicket, и я делаю это через запрос LINQ to Object.

Будет ли это причиной того, что мой запрос LINQ будет выполняться каждый раз, когда создается LocalTicket или только один раз? Могу ли я лучше инициализировать список из запроса LINQ статическим методом в классе или нестационарным методом заполнить список с объектами и потребовать, чтобы вызывающие методы в моем классе утилиты создавали новый объект можно сравнить объекты? Или путем его инициализации при определении его? Получаемые LocalTickets, созданные из содержимого запроса, используются локально и создаются заново с каждым прогоном, чтобы обнаружить фактические изменения, внесенные в базу данных через приложение Help Desk.

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

Наверное, мне нужно руководствоваться проектами классов, содержащих вызовы внешних источников, которые генерируют объекты, например, фабричные вещи или что-то в этом роде.

При чтении этого в контексте, я удивлен, если кто-то на самом деле быть в состоянии дать мне совет, но я рискну ...

+1

Оформить заказ этой замечательной статьи от Jon Skeet на статической инициализации C#: http://msmvps.com/blogs/jon_skeet/archive/2010/01/26/type-initialization-changes-in-net-4-0.aspx –

+0

Спасибо! Я прочитаю его внимательно. Я также читаю последнюю версию «C# In Depth» Скита (как электронную книгу MEAP, поскольку она еще не опубликована), и этот парень действительно знает свой C#! – 2013-03-26 23:05:05

ответ

0

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

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

Итак:

  • Услуги по продаже билетов.
  • WorklistService.

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

Вашего главный workloop может состоять из:

this.ticketService = new TicketService(/*some DB location*/); 
this.worklistService = new WorklistService(/*worklist DB or URL location*/); 
while (stillRunning) { 
    List<Ticket> tickets = ticketService.queryTickets(); 
    syncTickets(tickets); 
    // wait 1 minute. 
} 

Надеется, что это помогает.