Здравствуйте, s.and, Вы писали:
KS>>Теперь Вы видите, Влад написал что мы защитимся от неверных переданых типов. KS>>И да, я сомневаюсь, что Влад написал неоптимизированый код.
SA>Едрить твою налево, это можно было и не перепечатывать. Я замысел Влада и так понял. Знаю, что такое оператор as... SA>В реализации замысла Влада действительно была опечатка, на которую ты сказал (заменить obj на member).
Спасибо, что всё-таки подтвердили мою правоту и признали свою неправоту в том, что это всё-таки опечатка.
SA>Но! SA>Если obj не DropDownMember и не его наследник, то метод Влада с учетом твоего замечания возвратить -1, что не верно, как неверно и любое другое значение. Метод первым делом должен содержать проверку наподобие этой:
SA>
SA>if (obj == null)
SA>throw ArgumentNullException("obj");
SA>if (object.ReferenceEquals(obj as DropDownMember, null))
SA>throw new ArgumentException("Noncompatible type", "obj");
SA>
SA>Изучайте: SA>1. правила хорошего тона проверки аргументов; SA>2. правила реализации методов сравнения.
Влад, Вы поняли? Изучайте!!! Ибо у Вас плохой код!
Здравствуйте, Kore Sar, Вы писали:
KS>Влад, Вы поняли? Изучайте!!! Ибо у Вас плохой код!
Предлагаю не прятаться за авторитет Влада, а признать, что возвращение методом ComnpareTo -1 (да и любого другого значения), если сравниваемый аргумент имеет несовместимый тип — плохой код.
Или же, если имеешь иное мнение, привести свои аргументы.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Kore Sar, Вы писали:
KS>>Влад, Вы поняли? Изучайте!!! Ибо у Вас плохой код!
А>Предлагаю не прятаться за авторитет Влада, а признать, что возвращение методом ComnpareTo -1 (да и любого другого значения), если сравниваемый аргумент имеет несовместимый тип — плохой код. А>Или же, если имеешь иное мнение, привести свои аргументы.
Да мне пофигу, хорошо это или плохо. Мне пофигу твоё мнение. Мне пофигу авторитет Влада. Мне пофигу хороший и плохой код в любом понимании этих слов. Мне пофигу вообще эта дискуссия. Я соглашусь со всем чем хочешь, только отстань от меня, ладно?
А>>Предлагаю не прятаться за авторитет Влада, а признать, что возвращение методом ComnpareTo -1 (да и любого другого значения), если сравниваемый аргумент имеет несовместимый тип — плохой код. А>>Или же, если имеешь иное мнение, привести свои аргументы.
KS>Да мне пофигу, хорошо это или плохо. Мне пофигу твоё мнение. Мне пофигу авторитет Влада. Мне пофигу хороший и плохой код в любом понимании этих слов. Мне пофигу вообще эта дискуссия. Я соглашусь со всем чем хочешь, только отстань от меня, ладно?
KS>Я просто жду ответ Влада на свой вопрос.
Э нет... Не отстану. По причинам:
1. нет смысла ждать ответа Влада, т.к. ты заметил действительно опечатку;
2. зачем ты тогда вступил в дискуссию, если, как утверждаешь, хочешь только ответа по поводу опечатки, но не хочешь обсуждать качество предложенных Владом решений.
3. В твоей последней сентенции один из пунктов — наглая ложь. Вот она: "Мне пофигу авторитет Влада". Как только оказалось, что решение Влада, мягко говоря, не идеально, ты тебя тут же кончились аргументы, и ты тут же спрятался за спину своего великого гуру.
Интересно, теперь, когда так некрасиво засветился почитатель Влада, сочтет ли Влад целесообразным вступать в эту дискуссию?
Впрочем, было бы очень интересно узнать мнение/разъяснение самого Влада по поводу критики предложенного им решения.
Тем более, что сам Влад, в отличие от его почитателя, в этом топике совершенно адекватно подискутировал и со скромным автором данного поста.
Здравствуйте, s.and, Вы писали:
А>>>Предлагаю не прятаться за авторитет Влада, а признать, что возвращение методом ComnpareTo -1 (да и любого другого значения), если сравниваемый аргумент имеет несовместимый тип — плохой код. А>>>Или же, если имеешь иное мнение, привести свои аргументы.
KS>>Да мне пофигу, хорошо это или плохо. Мне пофигу твоё мнение. Мне пофигу авторитет Влада. Мне пофигу хороший и плохой код в любом понимании этих слов. Мне пофигу вообще эта дискуссия. Я соглашусь со всем чем хочешь, только отстань от меня, ладно?
KS>>Я просто жду ответ Влада на свой вопрос.
SA>Э нет... Не отстану. По причинам:
Ок, поехали.
SA>1. нет смысла ждать ответа Влада, т.к. ты заметил действительно опечатку; SA>2. зачем ты тогда вступил в дискуссию, если, как утверждаешь, хочешь только ответа по поводу опечатки, но не хочешь обсуждать качество предложенных Владом решений.
Потому что Вы мне написали "ты не прав". Теперь Вы мне написали что я прав. Я своего от дискуссии добился. SA>3. В твоей последней сентенции один из пунктов — наглая ложь. Вот она: "Мне пофигу авторитет Влада". Как только оказалось, что решение Влада, мягко говоря, не идеально, ты тебя тут же кончились аргументы, и ты тут же спрятался за спину своего великого гуру.
Хорошо, это наглая ложь.
SA>Интересно, теперь, когда так некрасиво засветился почитатель Влада, сочтет ли Влад целесообразным вступать в эту дискуссию?
О мой кумир, о Влад! Приди! Осени мое чело своим знамением!
SA>Впрочем, было бы очень интересно узнать мнение/разъяснение самого Влада по поводу критики предложенного им решения.
Если я не ошибась, чуть выше в этом же треде пришли к выводу, что решение Влада не идеальное. И я не буду спорить, это действительно так. И ты прав, у него действительно плохой код, правила хороего тона не соблюдены.
SA>Тем более, что сам Влад, в отличие от его почитателя, в этом топике совершенно адекватно подискутировал и со скромным автором данного поста.
О Влад, осени же ты и меня свои знамением! И видел, у тебя есть меч!
KS>Ок, поехали.
SA>>1. нет смысла ждать ответа Влада, т.к. ты заметил действительно опечатку; SA>>2. зачем ты тогда вступил в дискуссию, если, как утверждаешь, хочешь только ответа по поводу опечатки, но не хочешь обсуждать качество предложенных Владом решений. KS>Потому что Вы мне написали "ты не прав". Теперь Вы мне написали что я прав. Я своего от дискуссии добился.
Я написал, что ты прав только в контексте (неверного) примера Влада. А первоначально ты писал, что в ReferenceEquals важно приведение, без контекста. В итоге пришли к консенсусу, но только по этому вопросу.
По ходу дела всплыли и другие вопросы, по которым ты начал дискутировать, но как только оказалась под сомнением непогрешимость решений Влада, так ты сразу за его спину.
SA>>3. В твоей последней сентенции один из пунктов — наглая ложь. Вот она: "Мне пофигу авторитет Влада". Как только оказалось, что решение Влада, мягко говоря, не идеально, ты тебя тут же кончились аргументы, и ты тут же спрятался за спину своего великого гуру. KS>Хорошо, это наглая ложь.
Пишешь правду, но неискренне.
SA>>Впрочем, было бы очень интересно узнать мнение/разъяснение самого Влада по поводу критики предложенного им решения. KS>Если я не ошибась, чуть выше в этом же треде пришли к выводу, что решение Влада не идеальное. И я не буду спорить, это действительно так. И ты прав, у него действительно плохой код, правила хороего тона не соблюдены.
Пишешь правду, но неискренне.
KS>Доволен? А теперь отстань.
Недоволен. Т.к. см. выше.
s.and, Вы самый педантичный в мире человек, что я когда-либо встречал.
Re[14]: Багодром: Реализация операторов сравнения
От:
Аноним
Дата:
03.04.08 10:27
Оценка:
Здравствуйте, Kore Sar, Вы писали:
KS>s.and, Вы самый педантичный в мире человек, что я когда-либо встречал.
Возможно.
Но мы обсуждали операторы сравнения, а в этой области не обойтись без пристального внимания к деталям. Иначе получается то, что Влад как раз и критиковал в своей неплохой статье.
Здравствуйте, Kore Sar, Вы писали:
KS>о Влад! Приди! Осени мое чело своим знамением!
Надо организовывать секту "Свидетелей Влада". Чую, будет иметь успех...
SA>>Например: SA>>сравнение myObj == null (с нетипизированным null) недопустимо, т.к класс MyObj реализует оператор ==. Выполните приведение к object ((object)myObj == null) или вызовите ReferenceEquals
E>А не проще сразу IsNull(object)?
Метод
public static bool object.IsNull(object obj)
не определен...
А если бы был, то это было бы сродни использованию CLS-совместимых static Equals, Add, Divide (вместо ==, +, / ) и т.д. вместо операторов. Т.е., совсем без операторов. Но вроде как такой код не совсем нагляден. С другой строны, если столько граблей из за этих операторов....
Здравствуйте, s.and, Вы писали:
VD>> Вот тот же запрет на сравнение с null типов определяющих операторы сравнения дал бы очень многое. SA>Да, это было бы элегантным решением. Причем, в существующем C#-стиле, когда компилятор запрещает какую-либо граблеопасную конструкцию для компиляции с выдачей соответствующих предупреждения и рекомендации.
Собственно, именно так и сделано в компиляторе Nemerle, о чем и было сказано в статье.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Kore Sar, Вы писали:
KS>Вероятно вместо выделеного obj должен был стоять member. KS>Я прав?
Да — это очепятка.
Если кто непонял почему надо использовать именно member, поясню...
Дело в том, что в CompareTo может быть передана ссылка на объект не того типа. Тогда оператор as (о граблях которого была отдельная статья) возвратит null и проверка на ссылку не пройдет. Это убережет от доступа по null-указателю и за одно приведет к верному результату — CompareTo возвратит -1.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Kore Sar, Вы писали:
KS>>Вероятно вместо выделеного obj должен был стоять member. KS>>Я прав?
VD>Да — это очепятка.
VD>Если кто непонял почему надо использовать именно member, поясню...
VD>Дело в том, что в CompareTo может быть передана ссылка на объект не того типа. Тогда оператор as (о граблях которого была отдельная статья) возвратит null и проверка на ссылку не пройдет. Это убережет от доступа по null-указателю и за одно приведет к верному результату — CompareTo возвратит -1.
О Влад! Вы здесь!
Влад, мы тут организовываем секту "Свидетей Влада". Вы не против?
Здравствуйте, VladD2, Вы писали:
VD>>> Вот тот же запрет на сравнение с null типов определяющих операторы сравнения дал бы очень многое. SA>>Да, это было бы элегантным решением. Причем, в существующем C#-стиле, когда компилятор запрещает какую-либо граблеопасную конструкцию для компиляции с выдачей соответствующих предупреждения и рекомендации.
VD>Собственно, именно так и сделано в компиляторе Nemerle, о чем и было сказано в статье.
Кстати, если бы компилятор C#-а предупреждал бы о том, что переменная не используется, ошибки можно было бы избежать. Тот же Немерловый компилятор такие предупреждения делает. Наскольк мне известно их делает и РеШарпер, но я им не пользуюсь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Дело в том, что в CompareTo может быть передана ссылка на объект не того типа. Тогда оператор as (о граблях которого была отдельная статья) возвратит null и проверка на ссылку не пройдет. Это убережет от доступа по null-указателю и за одно приведет к верному результату — CompareTo возвратит -1.
Здравствуйте, s.and, Вы писали:
SA>Если obj не DropDownMember и не его наследник, то метод Влада с учетом твоего замечания возвратить -1, что не верно, как неверно и любое другое значение. Метод первым делом должен содержать проверку наподобие этой:
SA>
SA>if (obj == null)
SA>throw ArgumentNullException("obj");
SA>if (object.ReferenceEquals(obj as DropDownMember, null))
SA>throw new ArgumentException("Noncompatible type", "obj");
SA>
Это слишком радикальный подход. В таком случае коллекцию содержащую не DropDownMember отсортировать будет нельзя, а при исходном подходе просто все не DropDownMember окажутся вверху списка. Учитывая, что для списка членов типа лучше быть плохо отсортированным нежели отсутствующим, генерировать исключения лучше не стоит.
В общем, это решение должно возлагаться на программиста который реализует логику для конкретного случая.
ЗЫ
В общем, я смотрю на нас на все тут весна действует и всем поспорить охота.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.