Re[43]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.11.04 08:17
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

AVK>>>>Применяется широко означает что не вносит каких то проблем. Разницу сечешь?

ГВ>>>Нет. Это означает только то, что "применяется широко". В качестве примера. Сколько раз твердили, что copy&past — программирование суть создание проблем самим себе? И что? Всё равно же часто применяется. Но сути-то это не меняет.
AVK>>Хорошо, расскажи тогда мне с какими ужасными проблемами я сталкиваюсь из-за наличия ToString()

ГВ>Не переводи стрелки. Сейчас я пример привёл только для того, чтобы показать, что и милиион леммингов может ошибаться.


Я вот как раз не перевожу.

ГВ>Ну а что до заморочек, то вот здесь
Автор: Геннадий Васильев
Дата: 08.11.04
я отвечал Владу по этому поводу.


Описания проблем я там не увидел.
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[44]: ToString()
От: mbergal  
Дата: 13.11.04 23:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ГВ>>Ну а что до заморочек, то вот здесь
Автор: Геннадий Васильев
Дата: 08.11.04
я отвечал Владу по этому поводу.


AVK>Описания проблем я там не увидел.


Постараюсь перечислить неудобства которые могли бы возникнуть у меня (Примеры получены поиском ToString в Janus)

1.
public static bool IsSubscribed(int id)
...
cmd.CommandText = "SELECT COUNT(*) FROM subscribed_forums WHERE id = " + id.ToString();


А если id это string, то корректнее

cmd.CommandText = "SELECT COUNT(*) FROM subscribed_forums WHERE id = " + id.ToSqlString();


Тогда получится что мы используем разные формы для семантически одинаковых операций

2.


catch (Exception e)
    {
    MessageBox.Show(e.ToString());
    restruct = true;
    }


Что будет показано пользователю?

Exeception: <exception type>
[...]blablabla
+ Stack Trace

Это действительно то что надо?

3.

idParam.Value = (int) r["id"];
nameParam.Value = r["ShortForumName"].ToString();


Первая и вторая строчки делают разные вещи?
Опять разные формы для семантически одинаковых операций?

P.S. Изложенное выше не есть аргумент в пользу какой то стороны в споре, просто мои use cases — без какого-либо анализа.
Re[45]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.11.04 10:33
Оценка:
Здравствуйте, mbergal, Вы писали:

M>1.

M>
M>public static bool IsSubscribed(int id)
M>...
M>cmd.CommandText = "SELECT COUNT(*) FROM subscribed_forums WHERE id = " + id.ToString();  
M>


M>А если id это string, то корректнее


А если id это Form то вобще работать не будет.

M>2.


M>

M>catch (Exception e)
M>    {
M>    MessageBox.Show(e.ToString());
M>    restruct = true;
M>    }
M>


M>Что будет показано пользователю?


M>Exeception: <exception type>

M>[...]blablabla
M>+ Stack Trace

M>Это действительно то что надо?


Да.

M>3.


M>
M>idParam.Value = (int) r["id"];
M>nameParam.Value = r["ShortForumName"].ToString(); 
M>


M>Первая и вторая строчки делают разные вещи?


Безусловно.

M>Опять разные формы для семантически одинаковых операций?


С чего ты взял что они семантически одинаковы? В колонке id гарантированно int, а вот в ShortName может быть либо string, либо DBNull.

M>P.S. Изложенное выше не есть аргумент в пользу какой то стороны в споре, просто мои use cases — без какого-либо анализа.


Ага, особенно мне первый вариант понравился.
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[46]: ToString()
От: mbergal  
Дата: 14.11.04 14:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mbergal, Вы писали:


[...]

AVK>А если id это Form то вобще работать не будет.


Не понимаю причем тут Form.

M>>2.


M>>

M>>catch (Exception e)
M>>    {
M>>    MessageBox.Show(e.ToString());
M>>    restruct = true;
M>>    }
M>>


M>>Что будет показано пользователю?


M>>Exeception: <exception type>

M>>[...]blablabla
M>>+ Stack Trace

M>>Это действительно то что надо?


Хорошо. А мне обычно обрабатывать и форматировать приходится, в зависимости от типа исключения.

[...]

M>>3.


M>>
M>>idParam.Value = (int)r["id"];
M>>nameParam.Value = r["ShortForumName"].ToString(); 
M>>


M>>Первая и вторая строчки делают разные вещи?


AVK>Безусловно.


M>>Опять разные формы для семантически одинаковых операций?


AVK>С чего ты взял что они семантически одинаковы?


Я просто спрашиваю.

AVK> В колонке id гарантированно int,


Вижу
(int)r["id"]


AVK> а вот в ShortName может быть либо string, либо DBNull.


А вот здесь "ShortName может быть либо string, либо DBNull" слабо выражено:

r["ShortForumName"].ToString();


Скорее здесь сказано "а в ShortForumName лежит какой-то object, его надо преобразовать в "human-readable string that is culture-sensitive"".

Можно представить следующую семантику приведенного выше фрагмента (возможно семантика в Janus не такая):

* ShortName приходит в как string или DBNull
* DbNull пришедший из запроса означает что данные не найдены
* Для не найденных данных мы используем default значение ''

тогда я бы написал

idParam.Value = (int)r["id"]; 
nameParam.Value = (string)if_null( r["ShortForumName"], "" );


Мне было бы яснее и спокойнее, чем ToString()

AVK>Ага, особенно мне первый вариант понравился.


Какой "первый вариант"?
Re[47]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.11.04 15:23
Оценка:
Здравствуйте, mbergal, Вы писали:

M>[...]


AVK>>А если id это Form то вобще работать не будет.


M>Не понимаю причем тут Form.


А при чем тут string?

M>Хорошо. А мне обычно обрабатывать и форматировать приходится, в зависимости от типа исключения.


Это просто недописки — воткнули для отладки, на нормальную обработку не заменили.

AVK>> а вот в ShortName может быть либо string, либо DBNull.


M>А вот здесь "ShortName может быть либо string, либо DBNull" слабо выражено:


M>
M>r["ShortForumName"].ToString();  
M>


M>Скорее здесь сказано "а в ShortForumName лежит какой-то object, его надо преобразовать в "human-readable string that is culture-sensitive"".


Ну так и есть. Подробности того что там лежит это уже более подробная информация.

M>Мне было бы яснее и спокойнее, чем ToString()


Это потому что вы незнакомы с ADO.NET.

AVK>>Ага, особенно мне первый вариант понравился.


M>Какой "первый вариант"?


Твой первый пример.
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[48]: ToString()
От: mbergal  
Дата: 14.11.04 17:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mbergal, Вы писали:


M>>[...]


AVK>>>А если id это Form то вобще работать не будет.


M>>Не понимаю причем тут Form.


AVK>А при чем тут string?


А, теперь вопрос понятен. Также как и int, DateTime etc., формирование SQL на основе string является типичной операцией. С Form мне кажется не такая типичная.
Мне легко, когда семантически одинаковые операции выражены синтаксически одинаково. Так что в приведенном use case — id.ToString() плохо, потому что для строки пришлось бы писать по-другому.


Кстати, а можно реально добиться синтаксиса id.ToSqlString() ? Я понимаю можно сделать

public string ToSqlString( int ) {}
...


[...]

AVK>>> а вот в ShortName может быть либо string, либо DBNull.


M>>А вот здесь "ShortName может быть либо string, либо DBNull" слабо выражено:


M>>
M>>r["ShortForumName"].ToString();  
M>>


M>>Скорее здесь сказано "а в ShortForumName лежит какой-то object, его надо преобразовать в "human-readable string that is culture-sensitive"".


AVK>Ну так и есть. Подробности того что там лежит это уже более подробная информация.


M>>Мне было бы яснее и спокойнее, чем ToString()


AVK>Это потому что вы незнакомы с ADO.NET.


Может быть. Вы имеете в виду что DBNull.ToString() == "" или что-то другое?
Все равно — я бы так не делал ( "ShortName может быть либо string, либо DBNull" намного лучше описывает суть дела, чем "в ShortForumName лежит какой-то object" )
Re[49]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.11.04 17:32
Оценка:
Здравствуйте, mbergal, Вы писали:

M>А, теперь вопрос понятен. Также как и int, DateTime etc., формирование SQL на основе string является типичной операцией.


Абсолютно нетипичная. Поскольку в случае строк используются параметры.

M>Мне легко, когда семантически одинаковые операции выражены синтаксически одинаково. Так что в приведенном use case — id.ToString() плохо, потому что для строки пришлось бы писать по-другому.


Это всего лишь экономия на коде, с параметрами возиться дольше. Опять же к ToString это никакого отношения не имеет.

M>Кстати, а можно реально добиться синтаксиса id.ToSqlString() ?


Не понял вопроса.

M>>>Мне было бы яснее и спокойнее, чем ToString()


AVK>>Это потому что вы незнакомы с ADO.NET.


M>Может быть. Вы имеете в виду что DBNull.ToString() == "" или что-то другое?

M>Все равно — я бы так не делал ( "ShortName может быть либо string, либо DBNull" намного лучше описывает суть дела, чем "в ShortForumName лежит какой-то object" )

Ага, и плевать что это в несколько раз больше кода?
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[50]: ToString()
От: mbergal  
Дата: 14.11.04 18:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mbergal, Вы писали:


M>>А, теперь вопрос понятен. Также как и int, DateTime etc., формирование SQL на основе string является типичной операцией.


AVK>Абсолютно нетипичная. Поскольку в случае строк используются параметры.


Т.е. pattern такой, а правильно понимаю?
1. Если параметрами SQL-statement являются только int'ами - пишем "sql ..." + <int>.ToString()
2. Если не все из них являются int'ами 
  2.1 Если не нужно sql-statement в строке используем параметры (binding)
  2.2 Если нужна строка sql-statement (нечасто случается но бывает) - используем ???

А если не такой, то какой?

[...]

M>>Кстати, а можно реально добиться синтаксиса id.ToSqlString() ?


AVK>Не понял вопроса.


можно ли сделать так, чтобы id.ToSqlString() работало?

Например, написав где-нибудь string ToSqlString( int ).

M>>>>Мне было бы яснее и спокойнее, чем ToString()


AVK>>>Это потому что вы незнакомы с ADO.NET.


M>>Может быть. Вы имеете в виду что DBNull.ToString() == "" или что-то другое?

M>>Все равно — я бы так не делал ( "ShortName может быть либо string, либо DBNull" намного лучше описывает суть дела, чем "в ShortForumName лежит какой-то object" )

AVK>Ага, и плевать что это в несколько раз больше кода?


Это правильный код — наверное бы писал. Вопрос, как много, как скоро бы надоело и какие бы абстракции я ввел чтобы стало лучше.
Re[51]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.11.04 19:44
Оценка:
Здравствуйте, mbergal, Вы писали:

M>Т.е. pattern такой, а правильно понимаю?


Нет никакого паттерна. Просто если параметр целое то надобности в подъеме полноценной механики нет.

AVK>>Не понял вопроса.


M>можно ли сделать так, чтобы id.ToSqlString() работало?


Если это int то нет.

AVK>>Ага, и плевать что это в несколько раз больше кода?


M>Это правильный код — наверное бы писал.


Правильный этот тот который работает.
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[52]: ToString()
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 14.11.04 22:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

M>>Это правильный код — наверное бы писал.

AVK>Правильный этот тот который работает.

К сожалению, это не единственный критерий "правильности" кода. Необходимый, но не единственный.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[44]: ToString()
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 14.11.04 22:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ГВ>>Ну а что до заморочек, то вот здесь
Автор: Геннадий Васильев
Дата: 08.11.04
я отвечал Владу по этому поводу.

AVK>Описания проблем я там не увидел.

А вот это:

Проблема метода ToString() состоит в неопределённости его семантики. Что у него на выходе? Будут ли обрезаны незначащие нули у типов с плавающей точкой? С какой точностью он выведет данные? Короче, то же самое, что и спецификация %f для функции sprintf(...).

... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[40]: ToString()
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.11.04 23:45
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, VladD2, Вы писали:


ГВ>>>1 2 3 дата?


ГВ>Это если у тебя дробная часть нулевая. А если нужно гарантировать ширину выводимого поля? ИМХО, та же самая проблема, что и при использовании спецификаций "%f" или "%n.nf".


Если нужно, то:
string str = string.Format("{0} {1} {2:0.00} {3}", 1, 2, 3.0, DateTime.Now);


Вот только эти если тут не причем. Главное, что очень часто нужно просто результат по умолчанию.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[53]: ToString()
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.11.04 00:01
Оценка: -1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

M>>>Это правильный код — наверное бы писал.

AVK>>Правильный этот тот который работает.

ГВ>К сожалению, это не единственный критерий "правильности" кода. Необходимый, но не единственный.


Сайдемся на том, что правильный код — это код который работает и не создает проблем. Так вот этот именн такой.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[45]: ToString()
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.04 10:15
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>[q]

ГВ>Проблема метода ToString() состоит в неопределённости его семантики.

Это не проблема, это опять философия и принципы.

ГВ> Что у него на выходе? Будут ли обрезаны незначащие нули у типов с плавающей точкой? С какой точностью он выведет данные?


Зависит от настроек системы. В 99% случаев это именно тот вариант, который нужен.
... << RSDN@Home 1.1.4 beta 3 rev. 231>>
AVK Blog
Re[54]: ToString()
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.04 11:04
Оценка:
Здравствуйте, VladD2, Вы писали:

M>>>>Это правильный код — наверное бы писал.

AVK>>>Правильный этот тот который работает.
ГВ>>К сожалению, это не единственный критерий "правильности" кода. Необходимый, но не единственный.
VD>Сайдемся на том, что правильный код — это код который работает и не создает проблем. Так вот этот именн такой.

Это ты о котором?
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Любопытно...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.04 11:04
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

M>>Что будет показано пользователю?

M>>Exeception: <exception type>
M>>[...]blablabla
M>>+ Stack Trace
M>>Это действительно то что надо?
AVK>>Да.
M>>Хорошо. А мне обычно обрабатывать и форматировать приходится, в зависимости от типа исключения.
AVK>Это просто недописки — воткнули для отладки, на нормальную обработку не заменили.

Вот и первое подтверждение тезису:

ГВ>С другой стороны это также может означть, что в некоторых случаях приходиться поступаться пожеланиями к строковому представлению в угоду уже имеющейся реализации. Только-то и всего.

... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[41]: ToString()
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.04 11:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Главное, что очень часто нужно просто результат по умолчанию.

Об этом ты уже говорил:

VD> Они [требования — ГВ.] в 90% случаев не предявляются.


Осталось определить группу ситуаций, в которых достаточно получить только "результат по умолчанию". Ситуации использования String.ToString() не учитываем, т.к. это — простое копирование.

Про одну ситуацию AVK уже сказал
Автор: AndrewVK
Дата: 14.11.04
:

Это просто недописки — воткнули для отладки, на нормальную обработку не заменили.


Какие ещё варианты?

Да, учти ещё, что далеко не всегда удобно получить "3.24465830E-3" вместо "0.003245", а преобразование строки в строку по сути, тривиально.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[46]: ToString()
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.04 11:10
Оценка: +1 :)
Здравствуйте, AndrewVK, Вы писали:

ГВ>>Проблема метода ToString() состоит в неопределённости его семантики.

AVK>Это не проблема, это опять философия и принципы.
Ну, тогда нам и спорить-то не о чем. Ты попросту не видишь проблемы там, где она есть.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[55]: ToString()
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.11.04 13:25
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Это ты о котором?


О xxx.ToString()
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: ...и котлеты
От: eugals Россия  
Дата: 15.11.04 18:02
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD> Что-же можешь вместе с ПК соблюдать правила разных ОЦП и т.п. даже во прики банальному разуму.


Почему-то вспомнилась ода Ломоносова:
Дерзайте, ныне ободренны,
Реченьем вашим показать,
Что может собственных платонов
И быстрых разумов невтонов      // <- тут бы надо "банальных разумов VladD2"
Земля российская рождать.


Извините, не удержался
... << RSDN@Home 1.1.4 beta 3 rev. 215>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.