Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение.
Читаю подобные темы и неудержимо тянет на гомерический хохот http://rsdn.ru/forum/dotnet/6006483.flat.1
"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?
Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).
Пример на С#:
public sealed class World
{
...
private hkpWorld physicsWorld;
...
public World()
{
//initialize world's physics and geometry with default values
setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
}
...
public hkpWorld getWorld()
{
//Yellow!!!
//I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
hkpWorldCinfo worldInfo = new...;
//let's change gravity from 9.8f to 10 because...
worldInfo.m_gravity = 10;
physicsWorld = new hkpWorld(worldInfo);
...
//Hello, I'm mapnik and I see this code
//FUUUUUUCK!!!return physicsWorld;
}
...
}
И пример на С++, не допускающий подобного:
class World {
public:
World(){
//initialize world's physics and geometry with default values
setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
}
~World();
//No Radjesh you can't :)))
hkpWorld* getWorld() const { return physicsWorld; };
...
private:
...
hkpWorld * physicsWorld;
...
};
Это вы, как говорится, ещё в ракете не смотрели С небольшой помощью рефлексии можно менять readonly, вызывать приватные методы и творить другие чудеса.
В первой версии C# на это не было времени, в следующих в общем тоже, сейчас стандартный подход к этой проблеме — аттрибут [Pure], и последующая проверка контрактами + подсказки решарпера.
Но фичи нехватает, это да. В Nemerle у меня для этого был макрос и подсветка всех изменяемых переменных и полей болдом.
Здравствуйте, mapnik, Вы писали:
M>Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение. M>Читаю подобные темы и неудержимо тянет на гомерический хохот
ну, смех без причины...
С++ — один сплошной чудовищный маразм. С# не идеален, идеального в этом мире ничего нет, но НАМНОГО лучше.
и да, у меня ~18 лет на С++ и 4 на шарпе. и таких как я немало. а вот чтобы человек с шарпа перешел на плюсы и радовался — что-то о таком не слышал.
M>"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?
Если серьзно, то начиная с шестого шарпа очевидно поменялся подход к отбору фич.
Классика "дизайним очередной big thing и вылизываем всё, что с ним связано" никуда не делась.
Но помимо неё в язык по мере возможности добавляется мелочёвка, которая почти не влияет на public API и которая не особенно нужна в энтерпрайзе (серьёзно, если в коде такой баррдак, что даже приватные методы использовать небезопасно, ну сделай ты рефакторинг!).
Зато эта мелочёвка будет полезна для всяких скриптов/однодневных поделок и прочего write-only кода.
Это ни хорошо, ни плохо, просто последствия попытки пролезть в мобильную нищу и в нишу инди-сайтов.
Immutable входит в список big-thing-кандидатов на следующий релиз.
Если хочется аж пипец как — пишем свой [ImmutableAttribute] + проверку в FxCop или реврайтим ч/з постшарп. Дел на два дня вместе с изучением. Я что-то такое писал лет восемь назад, выкинуто за ненадобностью.
Потому что в реальной жизни Раджеш просто выпилит const/извратится с const_cast (или как там его?).
M>Discuss, господа, discuss
А что тут обсуждать?
Во-первых, нефиг дизайнить API так, чтобы естественное с точки зрения новичка использование приводило к ошибкам
Во-вторых, если уж припёрло, покрываешь сеттеры дебаг-ассертами и пусть твой Раджеш хоть через рефлексию ломится.
UPD и да, в любом более-менее пристойном месте попытка закомитить код, который нарушает даже соглашения по именованию, приведёт к выпилу кода, Раджеша и люлям для нанявшего и тимлида. Ибо нефиг.
Здравствуйте, Sinix, Вы писали:
S>Если хочется аж пипец как — пишем свой [ImmutableAttribute] + проверку в FxCop или реврайтим ч/з постшарп. Дел на два дня вместе с изучением. Я что-то такое писал лет восемь назад, выкинуто за ненадобностью.
Я не хочу бороться со средой, я хочу иметь такой дизайн языка который позволит мне расставлять rules, которые станут опорными точками для Раджешей.
S>Потому что в реальной жизни Раджеш просто выпилит const/извратится с const_cast (или как там его?).
Раджеш не выпилит const (иначе выпилят его) и он не знает про const_cast. Раджеш справедливо боится трогать чужой без детальных инструкций по шагам. Но если что-то не запрещено, то он в принципе волен делать что ему в голову придет — это вполне логично и справедливо. C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.
S>Во-вторых, если уж припёрло, покрываешь сеттеры дебаг-ассертами и пусть твой Раджеш хоть через рефлексию ломится.
Пути есть но они сложные и тупые. Я хочу видеть элегантный дизайн языка из коробки для подобных вещей. C# подход подталкивает к написанию говнокода из коробки.
Здравствуйте, mapnik, Вы писали:
M>И пример на С++, не допускающий подобного:
class World {
public:
World(){
//initialize world's physics and geometry with default values
setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
}
~World();
//No Radjesh you can't :)))
hkpWorld* getWorld() const
{
//Yellow!!!
//I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
hkpWorldCinfo worldInfo = new...;
//let's change gravity from 9.8f to 10 because...
worldInfo.m_gravity = 10;
auto myRajeshphysicsWorld = new hkpWorld(worldInfo);
...
//Hello, I'm mapnik and I see this code
//FUUUUUUCK!!!return myRajeshphysicsWorld;
};
...
private:
...
hkpWorld * physicsWorld;
...
};
Ваш пример хороший потому как я старался привести простейший пример для понимания. В реальной жизни Раджеш не сможет создать с нуля physicsWorld, это сложный объект с множеством не очевидных мемберов и методов. Если что-то инициализировать некорректно, все сразу упадет.
Здравствуйте, mapnik, Вы писали:
M>Ваш пример хороший потому как я старался привести простейший пример для понимания. В реальной жизни Раджеш не сможет создать с нуля physicsWorld, это сложный объект с множеством не очевидных мемберов и методов. Если что-то инициализировать некорректно, все сразу упадет.
Здравствуйте, mapnik, Вы писали:
ARK>>Ну в вашем C#-примере он ведь смог.
M>Но это же упрощение для вас в контексте дискуссии. В реальности он смог только изменить значение гравитации
Но, получается, если создать новый мир он не смог, то он смог передать свое неверное значение гравитации в существующий экземпляр мира?
Тогда и в C++ он это сможет.
Здравствуйте, mapnik, Вы писали:
M>Я не хочу бороться со средой, я хочу иметь такой дизайн языка который позволит мне расставлять rules, которые станут опорными точками для Раджешей.
Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете. Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.
M>Раджеш не выпилит const (иначе выпилят его) и он не знает про const_cast. Раджеш справедливо боится трогать чужой без детальных инструкций по шагам.
Не надо недооценивать стажёров
M>C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.
Геттер без сеттера + init-метод?
M>Пути есть но они сложные и тупые. Я хочу видеть элегантный дизайн языка из коробки для подобных вещей. C# подход подталкивает к написанию говнокода из коробки.
Не больше и не меньше, чем другие языки. Просто перед тем как писать API, надо изучить готовые рекомендации. Для шарпа design guidelines расписаны великолепно.
Здравствуйте, Sinix, Вы писали:
S>Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете.
Мы таким не занимаемся, у нас не luxoft и не infosys. 19 тим-лидов девочек с украины не держим которые умеют красивый текст в c# на клавиатурке набирать. мне важно что человек знает как инженер, а не как кодер.
S>Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.
Я хочу использовать дизайн языка а не ковырять очередное поделие от микрософта. Понимаете вы мне все время говорите — "а вот пара дней помучать задницу, и вы разродитесь решением". Меня такой подход не устраивает потому что для меня ЯП это не вещь в себе а инструмент для решения определенной задачи. И я не собираюсь вникать в эти индусские идеи чтобы исправить индусские баги. Это детский сад. Мне нужен approach на уровне дизайна языка, в C# его нет. Это касается не только конкретно этой фичи но и кучи других вещей. Напр. множественное наследование. В дизайне языка просто отсутствуют rules которые помогли бы формировать корректный код. Вместо это вас отправляют к каким-то паттернам, стайл копам и прочей чуши. Это просто бред
S>Не надо недооценивать стажёров
Вы просто не работали с индусами.
M>>C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса. S>Геттер без сеттера + init-метод?
Это слишком жесткая связка. Я не хочу ограничивать себя readonly методом. Очередная недороботка C# по дизайну. Очень грустно программировать на подобных языках
Здравствуйте, mapnik, Вы писали:
S>>Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете. M>Мы таким не занимаемся ... мне важно что человек знает как инженер, а не как кодер.
Ну так и пусть инженер занимается своим делом, а разработчик своим. Вы ж стоматолога не за красивые красные глаза выбираете?
Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное.
S>>Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два. M>Я хочу использовать дизайн языка а не ковырять очередное поделие от микрософта. Понимаете вы мне все время говорите — "а вот пара дней помучать задницу, и вы разродитесь решением".
Ваш кэп: вы ставите задачу "сделайте мне c#, который прощает ошибки от не изучавших c#". Спрос на такое маленький, придётся часть делать самостоятельно. Выбирайте любой другой инструмент, меняйте команду, найдите специалиста, который решал подобные проблемы. Форум вам тут как поможет?
Если проблема не настолько критичная, то тогда надеяться на "кто-то за меня поправит" тем более не стоит.
S>>Геттер без сеттера + init-метод? M>Это слишком жесткая связка. Я не хочу ограничивать себя readonly методом. Очередная недороботка C# по дизайну. Очень грустно программировать на подобных языках
Ну так берите любой другой язык, в чём проблема-то?
Здравствуйте, Sinix, Вы писали:
S>Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное.
Вы я так полагаю мните себя этаким опытным суперпрофессионалом который не совершает ошибок и может решать выкинуть на улицу или нет "менее опытных" людей?
Я придерживаюсь абсолютно противоположного мнения относительно своего опыта и знаю. Я абсолютно уверен что код который я написал содержит много дерьма. Поэтому не сужу других людей. Но нельзя все время быть в дерьме, нужно совершенствоваться.
Поэтому мы используем статический анализ код и периодические разборы вне зависимости от опыта и должности. Но это еще не все. Сам дизайн языка важен, чтобы "новичок" мог опереться на какие-то rules и не наломать дров. C# не имеет такого выверенного дизайна, нацеленного на повышение качества кода. Это просто набор фич которые позволят вам писать говнокод быстро. И от релиза к релизу в шарпе ничего не меняется — количество удобных фич для разработки говнокода просто растет. Вот что я хочу до вас донести.
S>Ну так берите любой другой язык, в чём проблема-то?
Проблема в том, чтобы найти хоть кого-то знающего с++ или sql почти нереально. А C# выучить может любой индус, который не осилит даже python. Отсюда и ограничения.
Здравствуйте, mapnik, Вы писали:
S>>Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное. M>Вы я так полагаю мните себя этаким опытным суперпрофессионалом который не совершает ошибок и может решать выкинуть на улицу или нет "менее опытных" людей?
Нет конечно, с чего вы взяли, что людей надо сразу выкидывать на улицу? Если человек допускает ошибки по неопытности, то это лечится обучением и совместным разбором ошибок, а не "уходи, ты плохой" или намёками про Раджеша.
M> Я абсолютно уверен что код который я написал содержит много дерьма. Поэтому не сужу других людей.
Порвало
Вы свой предыдущий пост прочитайте, который про Раджеша, "люксофт с 19 девочками", "поделие от микрософта", "я не собираюсь вникать в эти индусские идеи" и тд. Морализатор блин
M>Поэтому мы используем статический анализ код и периодические разборы вне зависимости от опыта и должности. Но это еще не все. Сам дизайн языка важен, чтобы "новичок" мог опереться на какие-то rules и не наломать дров. C# не имеет такого выверенного дизайна, нацеленного на повышение качества кода.
Вот с этого и надо было начинать. Потому что первый же ответ был про И утром, ото сна восстав, Читай усиленно устав чудо-книгу FDG, в которой основные ошибки и подходы к дизайну API разобраны от и до.
После изучения большинство вопросов будут в духе "и зачем нам эта фигня?", а не "почему шарп позволяет написать фигню?"
M>Это просто набор фич которые позволят вам писать говнокод быстро. И от релиза к релизу в шарпе ничего не меняется — количество удобных фич для разработки говнокода просто растет. Вот что я хочу до вас донести.
Разумеется. Потому что это мейнстрим-язык, причём чисто исторически — заточенный под энтерпрайз разработку. Т.е. некоторый входной барьер предполагается по умолчанию.
M>Проблема в том, чтобы найти хоть кого-то знающего с++ или sql почти нереально. А C# выучить может любой индус, который не осилит даже python. Отсюда и ограничения.
Это распространённое заблуждение. Поздравляю, вы начинаете понимать, что не всё так просто