Как string преобразуется в bool? - страница 3

 
string str[4]="Period RSI invert:"+(string)invert_p_rsi;
 
George Merts:

На мой взгляд, подобное обращение с типами - это очнеь нехороший стиль программирования.

Вобще, с преобразованием типов надо быть очень осторожным - типы придуманы для того, чтобы возложить на компилятор задачи по контролю допустимых значений перменных. В строку не может прямо передаваться булевое значение true. А если необходимо, чтобы был передан текст "true" - то это надо сделать явно.


в mq4 всё классно)
 
fxsaber:

спасибо!
 
Nikolay Gaylis:

в mq4 всё классно)

Во-первых, в MQL4 не "классно", а "нет сообщения об ошибке". Что как раз очень плохо.

Если произойдут какие-то большие изменения (придумают MQL6) - подобные "классные" места дадут ошибки в первую очередь.

А во-вторых, именно привычка к подобному расхлябанному стилю программирования и приводит потом к весьма сложно выявляемым ошибкам. В данном случае, действительно, достаточно провести явное преобразование, как предложил fxsaber, но, на мой взгляд, правильнее было бы объявление функции BoolToString(bool bValue), где прямо, в зависимости от входной величины возвращается та или иная строка, и ее использование для преобразований.

 
George Merts:
Именно приведение типов позволяет надежно и лаконично писать через макросы,

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2017.02.08 14:19

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"


string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

получая очень понятный результат на выходе.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2017.02.10 12:01

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.0645
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_IOC (1)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment =
Request.position = 57775
Request.position_by = 0

Явное написание BoolToString и подобных сделало бы код, как минимум, менее читаемым. А их использование - увеличило время на разработку и отладку.

 
fxsaber:

Явное написание BoolToString и подобных сделало бы код, как минимум, менее читаемым. А их использование - увеличило время на разработку и отладку.


Именно в данном случае не могу согласиться. Как раз BoolToString является более читабельным, чем безликий, ни о чём не говорящий, макрос TOSTRING. Макросы, конечно, вещь неплохая, но ведь это не значит, что их нужно использовать во всех случаях жизни. У них тоже есть свои недостатки, которые в такой ситуации перевешивают преимущества от их использования.
 
Ihor Herasko:

Именно в данном случае не могу согласиться. Как раз BoolToString является более читабельным, чем безликий, ни о чём не говорящий, макрос TOSTRING. Макросы, конечно, вещь неплохая, но ведь это не значит, что их нужно использовать во всех случаях жизни. У них тоже есть свои недостатки, которые в такой ситуации перевешивают преимущества от их использования.

Тут даже спорить не нужно. Достаточно попробовать написать свою

string ToString( const MqlTradeRequest &Request );

с результатом, как показано выше. И тогда вывод будет однозначен.

 
fxsaber:

Тут даже спорить не нужно. Достаточно попробовать написать свою

с результатом, как показано выше. И тогда вывод будет однозначен.


Не понял, о чём спорить? Что в таком виде:

string BoolToString(bool bValue)
{
   return bValue? "true" : "false";
}

является неясным? Все прозрачно.

Каким образом в данном случае (преобразование bool в string) поможет представленная функция ToString(), на вход которой, к тому же, подается MqlTradeRequest, а не bool?

 
Ihor Herasko:


Не понял, о чём спорить? Что в таком виде:

является неясным? Все прозрачно.

Каким образом в данном случае (преобразование bool в string) поможет представленная функция ToString(), на вход которой, к тому же, подается MqlTradeRequest, а не bool?

Привел практический пример, когда нужно распринтовать MqlTradeRequest. Мы же в конце-концов исходим из практических задач, а не порассуждать только.


Так вот отказ от приведений типов в пользу таких монстров а-ля BoolToString влечет за собой хреновый код. Чтобы в этом убедиться, достаточно переписать вышеприведенную функцию, отказавшись от приведения типов.


Единообразная запись, не зависящая от типов - это сила, а не костыль. Отсюда растут макросы и шаблоны, делая код универсальным.

 
fxsaber:
 

Единообразная запись, не зависящая от типов - это сила, а не костыль. Отсюда растут макросы и шаблоны, делая код универсальным.

Мне кажется, что тут надо глядеть по обстоятельствам. Где-то сила, а где-то потенциальные проблемы.

В частности в макросах не происходит проверка типов. Просто тупо раскрывается содержимое макроса с параметрами. И, боюсь, не везде это хорошо. 

В данном случае - проблем нет.

Но, если макрос раскрывается в какие-нибудь сравнения - все уже далеко не так однозначно.  Скажем, если в результате работы макросов будет раскрытие в byte и в int - сравнение данных величин запросто приведет к сложно вычисляемому зацикливанию (при переполнению байта, который может не достичь значения, заданного в int'e). 

Я очень хорошо помню, как убил почти неделю на выявление подобной "плавающей" ошибки. Именно после этого я очень полюбил строгую "венгерскую" нотацию, поверх четкого типизирования переменных. Потенциальная проблема в выражении while(btCounter < iMaxValue) - гораздо более заметна, чем в выражении while(GetCounter()<GetMaxValue())


В данном случае - не вижу ничего "монстрообразного" или "хуже читаемого", хоть в макросе TOSTRING(), хоть в функции BoolToString(). По-моему, это вполне эквивалентные варианты, очень слабо отличающиеся друг от друга.

Причина обращения: