Вот два небольших примера.
1. Есть очень популярная задача, организовать конвейер для обработки документов, которые по сути из себя представляют Map или, если говорим о C#, Dictionary. К Dictionary в дот нете, у меня есть одна большая претензия, он слишком часто кидает исключения. Но речь не об этом. Вот так выглядит простой документ, я добавил в него метод AddProperty, с помощью которого можно не только добавить элемент, но и перезаписать старый:
- public class Document : Dictionary<string, object>
- {
- public Document AddProperty(string name, object value)
- {
- if (ContainsKey(name))
- Remove(name);
- Add(name, value);
- return this;
- }
- }
API конвейера тоже простое:
- public class Pipeline
- {
- public void AddProccessor(Func<Document, Document> proccessor)
- {
- }
- public void Execute()
- {
- }
- }
Но самое интересное теперь. Иногда требуется добавить очень простую обработку, которая просто добавляет пару полей к документу. В java пришлось бы поступить как в свинге, анонимный класс с реализацией метода интерфейса листенера. Но в C# коллега подсказал очень и очень красивое решение:
- var pipeline = new Pipeline();
- pipeline.AddProccessor(record => record.AddProperty("NewProp", "Value").AddProperty("AnotherProp", 1));
2. На эту тему копий сломано не мало, перегрузка методов или параметры по умолчанию. Кто бы, что ни говорил, но C# 4.0 c параметрами по умолчанию плюс именование параметров, лично для меня, отличное, красивое и удобно решение.
Вот есть метод:
- public static string format(string value,
- bool option1 = false, bool option2 = false)
- {
- return value;
- }
- format("test", option2: true);
Ну и так, ещё одна рабочая мысль за сегодня: парное программирование - это не только весело, но и действительно продуктивно.
И совсем напоследок цитата дня (которую правда уже постил в Buzz'е, но уж больно понравилась):
- select fun, profit from real_world where relational=false
Интересные мысли. При переходе с С++ на Java очень нахватало 'значений параметров по умолчанию' и 'указателей на функцию'.
ОтветитьУдалитьНо с другой стороны это ковбойством каким-то попахивает:) Я бы не назвал код в третьем листе таким уж очевидным. Да и 'в одну строчку' тоже довольно спорно (при стандартной длине строки в 80).
Знаете, не ковбойство это помоему. А когда имя параметра указываешь, то даже читается лучше однозначно. Параметры по умолчанию это не плохо, лучше чем стопитсот перегрузок метода. Указатели на функцию действительно лажовая штука, лучше функции высшего порядка :) Вообщем давно облизываюсь на Scala и пр. Лиспы и функциональщину, просто надо ещё мозг повернуть, чтобы этим правильно пользоваться...
ОтветитьУдалитьНу, а про 80 симвалов... не знаю, у меня даже на работе 19" :) а вообще можно разнести на несколько строчек, но при этом код все равно будет более читаемым по моему чем Java.
Насчёт интересности не знаю. просто иногда накипает :))
Спасибо за комментарий.
У каждого свое ИМХО, но все же:
ОтветитьУдалитьformat("test", option2: true);
1. Имея только эту строку практически невозможно сказать сколько аргументов принимает метод.
2. Нужно сделать дополнительные телодвижения, чтобы понять что такое option2:.
Мне кажется, что если код будет наполнен такими вот вызовами, то это только затруднит его изучение.
По поводу облизывания на Scala и пр. Лиспы и функциональщину: надо постараться попасть на соответсвующий проект, а там могзи сами повернутся :)
> 1
ОтветитьУдалитьБлагодаря перегрузке методов, такой же эффект достигается, считаю, что это не критично
> 2
Просто параметры не правильно названы, можно и понятнее сделать.
> По поводу облизывания на Scala....
Таки в наших краях очень сложно, освобождаю время, чтобы начать какой-нибудь свой midnight проект... :)
public Document AddProperty(string name, object value) { if (ContainsKey(name)) Remove(name); Add(name, value); return this; }
ОтветитьУдалитьА почему вместо этого не написать
this[name] = value;
?
Вроде эквивалентно будет.
Всё правильно, но как говориться: привычка - вторая натура. Т.е. возвращаемся к заголовку статьи :) Это всё противная java, очень не привычно с чем-то кроме массивов работать через [] =\
ОтветитьУдалитьДа... пытались меня как-то на java перевести после C# 3... неудачно. То есть, язык вменяемый, все понятно, ясно как делать... но писать море кода там, где раньше был iterator block, или кучку вложенных циклов-условий-снова-циклов где раньше был трехстрочный LINQ-запрос...
ОтветитьУдалитьСбежал я оттуда, в общем :)