Последние замечания по реализации



Если вы дочитали до этой точки, то вы – герой! Bravissimo! Kudos!

Чтобы сохранить статью краткой и понятной (и чего смешного?), я не стану вдаваться в скучные рассуждения о деталях реализации получения и переключения методов. В этом нет ничего интересного. Но если вам всё-таки интересно: качайте код и смотрите – он полностью рабочий! Названия классов и методов, могут немного отличаться, т.к. я правил его параллельно, но особых изменений быть не должно.

Внимание! Перед использованием кода в вашем проекте, внимательно прочитайте paenultimus. А если не знаете что значит paenultimus, кликайте по ссылке.

Использование

Перехват методов и свойств

Первое, нам нужна доменная модель. Ничего особенного.

public interface IActor{ string Name { get; set; } void Act();} public class Actor : IActor{ public string Name { get; set; } public void Act() {   Console.WriteLine("My name is '{0}'. I am such a good actor!", Name); }}

Теперь нам нужно действие

public class TheConcern : IConcern<Actor>{ public Actor This { get; set; } public string Name     {   set   {       This.Name = value + ". Hi, " + value + " you've been hacked";   } } public void Act() {   This.Act();   Console.WriteLine("You think so...!"); }}

При инициализации приложения мы сообщаем реестру о наших точках соединения

 

// Weave the Name property setterAOP.Registry.Join (   typeof(Actor).GetProperty("Name").GetSetMethod(),   typeof(TheConcern).GetProperty("Name").GetSetMethod() ); // Weave the Act methodAOP.Registry.Join (   typeof(Actor).GetMethod("Act"),   typeof(TheConcern).GetMethod("Act") );

И, наконец, мы создаем объект в фабрике

var actor1 = (IActor) AOP.Factory.Create<Actor>();actor1.Name = "the Dude";actor1.Act();

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

Если запустить всё это в консольном приложении, получим:

My name is 'the Dude. Hi, the Dude you've been hacked'. I am such a good actor!

You think so...!

 

Перехват File.ReadAllText(string path)

Здесь две небольшие проблемы:

• Класс File статичный

• и не реализует никакие интерфейсы

Помните о «добро»? Среда не проверяет тип возвращаемый прокси и соответствие интерфейсу.

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

Давайте создадим интерфейс прикидывающийся статичным классом File.

 

public interface IFile{ string[] ReadAllLines(string path);}

 

Наше действие

public class TheConcern{ public static string[] ReadAllLines(string path) {   return File.ReadAllLines(path).Select(x => x + " hacked...").ToArray(); }}

Регистрация точек соединения

 

AOP.Registry.Join (   typeof(File).GetMethods().Where(x => x.Name == "ReadAllLines" && x.GetParameters().Count() == 1).First(),   typeof(TheConcern).GetMethod("ReadAllLines") );

И, наконец, исполнение программы

var path = Path.Combine(Environment.CurrentDirectory, "Examples", "data.txt");var file = (IFile) AOP.Factory.Create(typeof(File));foreach (string s in file.ReadAllLines(path)) Console.WriteLine(s);

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

 

Основы унифицированного процесса разработки

"Тяжелые" и "легкие" процессы разработки

В этой лекции мы рассмотрим детально два процесса разработки — унифицированный процесс Rational (Rational Unified Process, RUP) и экстремальное программирование (Extreme Programming, XP). Оба они являются примерами итеративных процессов, но построены на основе различных предположений о природе разработки программного обеспечения и, соответственно, достаточно сильно отличаются.

RUP является примером так называемого "тяжелого" процесса, детально описанного и предполагающего поддержку собственно разработки исходного кода ПО большим количеством вспомогательных действий. Примерами подобных действий являются разработка планов, технических заданий, многочисленных проектных моделей, проектной документации и пр. Основная цель такого процесса — отделить успешные практики разработки и сопровождения ПО от конкретных людей, умеющих их применять. Многочисленные вспомогательные действия дают надежду сделать возможным успешное решение задач по конструированию и поддержке сложных систем с помощью имеющихся работников, не обязательно являющихся суперпрофессионалами.

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

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


Дата добавления: 2021-03-18; просмотров: 94; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!