Следующий пример плох, потому что он имеет повторение кода. Например, если нам понадобится CheckExpirationDate
перед употреблением, нам нужно добавить вызов функции в несколько мест. Если нам нужно добавить charley
и stan
на вечеринку, код будет очень быстрым.Обработка ряда именованных переменных того же типа
if (john != designatedDriver)
{
beer.Open();
john.Drink(beer);
}
if (bob != designatedDriver)
{
cider.Open();
bob.Drink(cider);
}
Решение может заключаться в создании массива этих объектов. Это очень просто, если вам нужно управлять одним объектом за раз. Например, если все проходит вокруг одной бутылки пива:
beer.Open();
foreach (Dude i in new Dude[] { john, bob })
{
i.Drink(beer);
}
Чтобы переписать исходный пример, мы можем использовать KeyValuePair
. Не особенно красиво, но стоит того, чтобы больше двух парней или если процедура выпивки достаточно длительная (дегустация вин).
foreach (KeyValuePair<Dude, Booze> i in KeyValuePair<Dude, Booze>[] {
new KeyValuePair<Dude, Booze>(john, beer),
new KeyValuePair<Dude, Booze>(bob, cider) })
{
if (i.Key != designatedDriver)
{
i.Value.Open();
i.Key.Drink(i.Value);
}
}
Но что, если нам нужно работать три или более объектов в то время? Например, john drink beer и ест nachos. Мы можем прибегнуть к объявлению пользовательских типов, но это сделает код зависимым от другого кода где-то далеко. Мы могли бы поместить каждый тип в свой собственный массив и сделать старый добрый цикл for
и получить доступ к объектам с индексами, но это будет означать создание названных массивов (Dude[] dudes = new Dude { john, bob };
).
Что я прошу, Есть ли какой-то причудливый трюк C#, который позволил бы мне сделать это очень чисто и компактно? Анонимные типы? Что нибудь?
Ваш первый и третий образцы кода не эквивалентны, как вы говорите. В третьем примере боб никогда не пьет свой сидр ... – LBushkin
Продумайте, пожалуйста. – CannibalSmith