Надлежащий Входящий в систему контекст ООП

База данных, подобная этой ...

{
  "en": { "Q1": "Who was JFK?"    },
  "es": { "Q1": "¿Quién era JFK?" }
}

Доступно как это (JavaScript) ...

var locale = fooLocale() || 'en'; // get locale, fallback to English
var firedb = firebase.database(); // init database
var content = firedb.ref(locale); // get reference to locale data

content.child('Q1').on('value', function (snapshot) {       // request Q1
  document.getElementById('Q1').innerHTML = snapshot.val(); // set UI text
});
8
задан Mihai Limbășan 26 October 2008 в 22:38
поделиться

16 ответов

Вы действительно хотите установить регистратор как глобальную переменную, потому что глобальные переменные не плохи. По крайней мере, они не по сути плохи. Регистратор является ярким примером надлежащего использования глобально доступного объекта. Читайте о шаблоне разработки Singleton, если Вы хотите больше информации.

13
ответ дан 5 December 2019 в 08:26
поделиться

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

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

Реалистично, я использую вход свободного городского населения большую часть времени (я делаю большую работу в Java), но существуют аспекты дизайна, который я описал выше этого, я нахожу выгодными. Преимущества наличия устойчивой системы регистрации, которую кто-то еще уже провел значительное время, отлаживая, перевесили потребность в том, что можно было считать более чистым дизайном (это очевидно субъективно, особенно учитывая отсутствие детали в этом сообщении).

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

0
ответ дан 5 December 2019 в 08:26
поделиться

Возможно, вставка Входа в систему прозрачного пути принадлежала бы идиомы Аспектно-ориентированного программирования. Но мы говорим дизайн OO здесь...

Шаблон "одиночка" может быть самым полезным, по-моему: можно получить доступ к сервису Входа от любого контекста до общественности, статического метода класса LoggingService.

Хотя это может много походить на глобальную переменную, это не: это правильно инкапсулируется в singleton-классе, и не все имеет доступ к нему. Это включает, Вы для изменения способа регистрироваться обрабатываетесь даже во времени выполнения, но защищаете работу входа из кода 'vilain'.

В системе я продолжаю работать, мы создаем много Регистрирующихся 'одиночных элементов', чтобы смочь отличить сообщения от различных подсистем. Они могут быть переключены вкл\выкл во времени выполнения, фильтры могут быть определены, писание в файл возможно..., Вы называете его.

0
ответ дан 5 December 2019 в 08:26
поделиться

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

обратите внимание, что Singleton эквивалентна, но включает ненужное выделение

если Вы используете несколько доменов приложения, остерегаетесь этого, Вам, возможно, понадобится объект прокси получить доступ к статическому классу от доменов кроме основного

также, если у Вас есть несколько потоков, Вы, возможно, должны заблокировать вокруг регистрирующихся функций, чтобы не чередовать вывод

По моему скромному мнению, один только вход недостаточен, вот почему я записал CALM

удачи!

0
ответ дан 5 December 2019 в 08:26
поделиться

Библиотека Предприятия, Регистрирующая Блок приложений, который прибывает из Шаблона Microsoft и группы Методов, является ярким примером реализации платформы журналирования в среде ООП. У них есть некоторая замечательная документация относительно того, как они реализовали свой блок приложений входа, и весь исходный код доступен для Вашего собственного обзора или модификации.

Существуют другие подобные реализации: log4net, log4j, log4cxx

У них способ, которым они реализовали Библиотеку Предприятия, Регистрирующую Блок приложений, должны быть помехи Logger класс со многими различными методами, которые на самом деле выполняют операцию журнала. При рассмотрении шаблонов, это, вероятно, было бы одним из лучшего использования Шаблона "одиночка".

0
ответ дан 5 December 2019 в 08:26
поделиться

Я - все для AOP вместе с log4*. Это действительно помогло нам. Google дал мне эту статью, например. Можно попытаться искать больше на том предмете.

0
ответ дан 5 December 2019 в 08:26
поделиться

(По моему скромному мнению), то, как 'вход' происходит, не является частью Вашего дизайна решения, это - больше части любой среды, которую Вы, оказывается, выполняете в - как Система и Календарь в Java.

Вашим 'хорошим' решением является то, которое максимально слабо связывается к какой-то конкретной реализации входа, так думайте интерфейсы. Я проверил бы след здесь для примера того, как Sun занялся им, когда они, вероятно, придумали довольно хороший дизайн и разметили все это, чтобы Вы извлекли уроки из!

0
ответ дан 5 December 2019 в 08:26
поделиться

Я думаю, что необходимо использовать AOP (аспектно-ориентированное программирование) для этого, а не ООП.

0
ответ дан 5 December 2019 в 08:26
поделиться

Вы могли посмотреть на Шаблон "одиночка".

0
ответ дан 5 December 2019 в 08:26
поделиться

Создайте регистратор как singleton-класс и затем получите доступ к нему с помощью статического метода.

0
ответ дан 5 December 2019 в 08:26
поделиться

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

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

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

0
ответ дан 5 December 2019 в 08:26
поделиться

Глобально доступный регистратор является болью для тестирования. Если Вам нужно "централизованное" средство входа, создают его на программе, запускают и вводят его в классы/методы тот вход потребности. Как делают Вас методы тестирования, которые используют что-то вроде этого:

public class MyLogger 
{
    public static void Log(String Message) {}
}

Как Вы заменяете его насмешкой?

Лучше:

public interface ILog 
{
    void Log(String message);
}

public class MyLog : ILog 
{
    public void Log(String message) {}
}
2
ответ дан 5 December 2019 в 08:26
поделиться

Я всегда использовал Шаблон "одиночка" для реализации регистрирующегося объекта.

1
ответ дан 5 December 2019 в 08:26
поделиться

Существуют, некоторые очень хорошо продумали решения. Некоторые включают обход OO и использование другого механизма (AOP).

Вход действительно не предоставляет себя слишком хорошо OO (который является хорошо, не все делает). Если необходимо реализовать его сами, я предлагаю просто инстанцировать "Журнала" наверху каждого класса:

частный финал log=new Журнал (это);

и все Ваши вызовы входа затем тривиальны: log.print ("Эй");

Который делает намного легче использовать, чем одиночный элемент.

Имейте свою фигуру регистратора, какой класс Вы являетесь передающими в и использование что аннотировать журнал. Так как у Вас затем есть экземпляр журнала, можно затем сделать вещи как:

log.addTag ("счет");

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

log4j и цепная пила являются идеальным из готового решения, хотя - если Вы не просто являетесь академическими, используйте их.

4
ответ дан 5 December 2019 в 08:26
поделиться

Еще одно возможное решение - иметь класс журнала, который инкапсулирует регистрацию / хранимую процедуру. Таким образом, вы можете просто создать экземпляр new Log (); всякий раз, когда он вам понадобится, без использования синглтона.

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

0
ответ дан 5 December 2019 в 08:26
поделиться

Чтобы избежать глобальных переменных, я предлагаю создать глобальный РЕЕСТР и прописать там свои глобалы.

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

На самом деле, я бы использовал одну из существующих сред ведения журналов.

0
ответ дан 5 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: