как я пишу код
May. 10th, 2013 03:35 pmу меня дофига статических generic классов, а также статических классов, в которых полно generic методов. под generic я имею в виду "имеющие type parameters" - ну вот это, с угловыми скобочками, you know. и использовать мне всё это очень удобно до тех пор, пока не возникает семейство - то есть, в традиционной миссионерской позиции надо было бы создать abstract parent class, засунуть туда общее, пронаследоваться, заимплементить специфику в потомках.
но, блядь, как известно, статический класс не может быть абстрактным, и от него нельзя пронаследоваться. не потому, что с абстрактными статическими классами есть какая-то логическая неувязка - нет, никакой неувязки нет в том, чтобы в родителе написать static protected abstract int GetNumber(), а в потомке - static protected override int GetNumber() { return 42; }. и использовать этот GetNumber() там в родителе, где живёт общая для всех потомков логика, использующая этот number. всё это отлично же резолвится во время компиляции, даже double dispatch не надо.
а потому что, блядь, создатели языка решили, что это будет слишком сложно для восприятия. та же причина, по которой у инстанса типа нельзя вызвать его статический метод. в object паскале можно, а тут, блядь, нельзя. monadic types с биндом, блядь, для них не слишком сложно, а это, блядь, слишком.
поэтому в таких случаях приходится писать обычные, не-статичеcкие классы, но без стейта, и заводить в клиентском классе статическое поле, чтобы не делать бессмысленное new каждый раз.
это, пожалуй, чуть ли не единственная претензия к сишарпу. ну и ещё ref/out параметры нельзя засовывать в лямбды. какого хрена? главное, что руками это "ограничение" обходится в три лишние строчки, но зачем меня заставлять эти три строчки каждый раз писать? да и не в писать дело, читать потом противно.
но, блядь, как известно, статический класс не может быть абстрактным, и от него нельзя пронаследоваться. не потому, что с абстрактными статическими классами есть какая-то логическая неувязка - нет, никакой неувязки нет в том, чтобы в родителе написать static protected abstract int GetNumber(), а в потомке - static protected override int GetNumber() { return 42; }. и использовать этот GetNumber() там в родителе, где живёт общая для всех потомков логика, использующая этот number. всё это отлично же резолвится во время компиляции, даже double dispatch не надо.
а потому что, блядь, создатели языка решили, что это будет слишком сложно для восприятия. та же причина, по которой у инстанса типа нельзя вызвать его статический метод. в object паскале можно, а тут, блядь, нельзя. monadic types с биндом, блядь, для них не слишком сложно, а это, блядь, слишком.
поэтому в таких случаях приходится писать обычные, не-статичеcкие классы, но без стейта, и заводить в клиентском классе статическое поле, чтобы не делать бессмысленное new каждый раз.
это, пожалуй, чуть ли не единственная претензия к сишарпу. ну и ещё ref/out параметры нельзя засовывать в лямбды. какого хрена? главное, что руками это "ограничение" обходится в три лишние строчки, но зачем меня заставлять эти три строчки каждый раз писать? да и не в писать дело, читать потом противно.
(no subject)
Date: 2013-05-10 11:42 pm (UTC)(no subject)
Date: 2013-05-11 05:16 am (UTC)(no subject)
Date: 2013-05-11 04:21 pm (UTC)(no subject)
Date: 2013-05-11 05:16 pm (UTC)(no subject)
Date: 2013-05-11 06:22 pm (UTC)2. Зачем в клиентском классе статическое поле? Если класс X без стейта, ему можно завести статическую проперть public static X Instance = new X() и пользовать её изо всех клиентских классов через X.Instance.
У меня, при нежной любви к C#, претензий побольше. Две главные:
- Отсутствие поддержки immutable типов. Количество бойлерплейт-кода зашкаливает настолько, что уже дозрел до написания кодогенератора вроде такого.
- Отсутствие интерпретатора. Это вообще ёбаный стыд: в винде до сих пор нету стандартного вменяемого скриптового языка, при том что C# -- готовый почти идеальный кандидат.
(no subject)
Date: 2013-05-11 06:55 pm (UTC)2. два глухих: ты в баню? нет, я в баню. а, я думал, ты в баню.
есть powershell. есть immutable коллекции. хотя, согласен, immutable типов не хватает.