2010-05-21 2 views
2

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

Так, например, если у меня есть класс Order, который имеет метод

public Customer GetCustomer() 
{ 
Customer CustomerInstance = // get customer 
return CustomerInstance; 
} 

Скажем, я хочу, чтобы войти в создание этих - Log (CustomerInstance);

Мои варианты (AFAIK) являются:

  1. Call Log() в каждом из этих методов перед возвратом объекта. Я не поклонник этого, потому что он становится громоздким, если используется на многих классах с большим количеством методов. Это также не является неотъемлемой частью цели метода.

  2. Применение композиции или наследования к слою журнале Callon класс Order, похожий на:

    GetCustomer госзаказчиках()
    {
    Клиент CustomerInstance = this.originalCustomer.GetCustomer(); Журнал (CustomerInstance);
    return CustomerInstance;
    }
    Я не думаю, что это купило мне что-нибудь за # 1.

  3. Создание методов расширения по каждому из возвращаемых типов: Log

    клиентов CustomerInstance = Order.GetCustomer()();.
    , который имеет как можно меньше минусов.

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

ответ

1

Вы должны смотреть в Aspect Oriented Programming:

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

Добавление регистрации является одним из видов использования этой методологии.

0

Ваш вариант 1, на мой взгляд, способ сделать это.Даже если это будет в конце каждого метода, вот что делается. Я бы не добавил лишние слои неясности, потому что это «не внутренняя цель» метода.

Кстати, аспектно-ориентированное программирование адресовано именно этой проблеме (см. Ответ ChrisF), но мы больше не говорим о C#.

Смежные вопросы