2011-12-26 2 views
2

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

Так что я собираюсь сделать что-то подобное.

Shall() - Not quite sure about this one yet 
    .Test(...) - Determines whether the contained logic executed without any errors 
    .Guard(...) - Guards the contained logic from throwing any exception 
    .Assert(...) - Asserts before the execution of the code 
    .Throw(...) - Throws an exception based on a certain condition 
    .Assume(...) - Similar to assert but calls to Contract.Assume 

Использование:. Father.Shall() Guard (е => f.Shop())

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

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

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

Некоторые примеры.

DbSet<TEntity> set = Set<TEntity>(); 

if (set != null) 
{ 
    if (Contains(entity)) 
    { 
     set.Remove(entity); 
    } 
    else 
    { 
     set.Attach(entity); 

     set.Remove(entity); 
    } 
} 

Изменения к следующему.

Set<TEntity>().Shall().Guard(set => 
{ 
    if (Contains(entity)) 
    { 
     set.Remove(entity); 
    } 
    else 
    { 
     set.Attach(entity); 

     set.Remove(entity); 
    } 
}); 

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

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

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

Обновление: Мне нужно подумать об этом еще и изменить API, чтобы сделать намерения понятными, а код более читабельным.

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

В любом случае, я оставлю это сейчас.

+0

Не уверен, что вы пытаетесь получить по контрактам с кодом. – CodesInChaos

+3

Вы забыли добавить метод Pray(). Не ожидайте, что кто-нибудь понравится читать ваш код. –

+1

'Shall',' Test' и 'Guard' выглядят довольно бессмысленно для меня. – CodesInChaos

ответ

6

Это звучит, как вы описываете что-то вроде контрактов Код: http://msdn.microsoft.com/en-us/devlabs/dd491992

+0

@eyal Это не то, что новый, на самом деле очень старый (насколько это касается вычислений) –

0

Если я понимаю, что вы ищете, то ближе всего я придумал это метод расширения:

public static Chain<T>(this T obj, Action<T> act) 
{ 
    act(obj); 
    return obj; 
} 

Это позволяет сделать следующее:

Set.Remove(Set.FirstOrDefault(entity) ?? entity.Chain(a => Set.Add(a))); 

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

+0

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

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