
Oleg
06.09.2016
12:22:58
в D нет множественного наследования и есть один базовый класс Object, от которого неявно наследуется любой класс

Dmitry
06.09.2016
12:23:26
Throwable это интерфейс?
Или абстрактный класс?

Oleg
06.09.2016
12:23:33
я же скинул ссылку

Google

Oleg
06.09.2016
12:23:43
прям на этот класс

Dmitry
06.09.2016
12:23:50
а класс судя по ней

Oleg
06.09.2016
12:24:05
ну только по ней и надо судить ?
это как бы официальный рантайм языка)

Eto
06.09.2016
12:37:28
И еще вопрос. Чем лучше исключения кодов возврата?
С кодами возврата много мороки. Каждая функция возвращает код, тебе после этого нужно данный код проверить. И так всё время. Плюс, функции в таком случае не могут возвращать результат, получается нужно постоянно использовать указатели.

Oleg
06.09.2016
12:40:21

Eto
06.09.2016
12:40:46
Согласен о tuple.

Dmitry
06.09.2016
12:42:38
Так есть фунция copy2FTP
В ней есть проверка кода ответа при копировании:
if(rs.code == 452)
{
writeln("Not Enough Free Space of FTP Server");
}
Т.е. продолжать нет смысла. Имеет ли мне смысл тут бросить исключение и поймать его в main или просто return сделать, что меня тоже в main вернет. Как праивльнее?

Oleg
06.09.2016
12:44:38
return просто вернёт в main и твоя программа исполнится дальше не сообщив, что файл не скопирован?
если это нормальное поведение (забить на то, что требовалось выполнить), то, в принципе, можешь и вернуть...

Dmitry
06.09.2016
12:47:09
Тоесть логичнее: if(rs.code == 452) throw new Exception("Not Enough Free Space of FTP Server");
и дальше в main поймать. ок понял

Oleg
06.09.2016
12:50:41
в этом случае у тебя это будет обрабатывать код, отвечающий за обработку ошибок, что по сути логичней
но если говорить в общем, то ты как архитектор всегда делаешь выбор между возвращаемым значением и исключением — нет единого правильного подхода

Dmitry
06.09.2016
12:53:36
сейчас у меня сделано вот так:
http://www.everfall.com/paste/id.php?wstqbilx01jp
По идее мне в случае любой ошибки нужно вызвать: updateFlags как быть то? А то тут оно не вызовется при нехватке места

Oleg
06.09.2016
12:56:09
может наоборот при успешной загрузке оно не вызовется?

Google

Dmitry
06.09.2016
12:57:49
при успешной должно вызываться с флагом 11, а при неуспешной с 13

Oleg
06.09.2016
12:58:21
ну так и напиши так
вообще тут не особо нужны исключения...
вот именно в этой ситуации
тк у тебя выброс исключения подразумевается в блоке try

Eto
06.09.2016
12:59:17
Немного не логично проверять код, бросать исключение и сразу же его ловить. Для чего тратить зря время, если можно сразу по коду всё понять?

Oleg
06.09.2016
12:59:46

Dmitry
06.09.2016
13:00:43
ай блин, тоесть я тут же его и поймаю получается?

Eto
06.09.2016
13:01:01
А как ты думал?

Dmitry
06.09.2016
13:01:19
блин, я почему-то подумал, что уровнем выше)

Eto
06.09.2016
13:01:55
Не в коде, который ты привёл?

Dmitry
06.09.2016
13:02:37
да щас то я понял что там же его и поймаю где кину

Eto
06.09.2016
13:02:49
Response rs = rq.post(ftpConnString ~ "/" ~ r.arch_path.baseName ~ "/" ~ f.baseName, cast(ubyte[])read(f));
if (rs.code == /* OK */) {
updateFlags(r.route_id, 11);
}
else {
// ...
}

Dmitry
06.09.2016
13:04:48
А по логике мне какой код возврата проверять?
"250 Запрос прошёл успешно"
прошел успешно == файл залился?
Вот список кодов https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%BE%D0%B2_FTP

Eto
06.09.2016
13:06:04
https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes
Видимо, 250 код.
А там нет никакого enum`а с кодами? А то получается ты magic numbers используешь, что нехорошо.

Dmitry
06.09.2016
13:08:37
а чем magic numbers плохи?

Oleg
06.09.2016
13:08:50
а ты как думаешь?)
`if (value == 42) { ... }`о чём может говорить?)

Google

Oleg
06.09.2016
13:09:51
только о том, что это проверка пройдёт, если value будет равно 42

Eto
06.09.2016
13:10:09
А в каких случаях value будет равно 42?

Oleg
06.09.2016
13:10:10
а что это за 42 такое, которому должно быть равно value из кода не ясно

Eto
06.09.2016
13:10:19
Вот, да.

Dmitry
06.09.2016
13:10:33
Автор в коде вообще так делает: https://github.com/ikod/dlang-requests/blob/261df21f2f548e8cf0aaba91aba4976f8e0d55bf/source/requests/ftp.d#L184

Eto
06.09.2016
13:10:50
Это трюк.

Oleg
06.09.2016
13:11:10
if (value == MAX_ITEM_COUNT) { ... } тут понятней

Eto
06.09.2016
13:11:22
Т.к. в HTTP 2XX коды являются success ответами.

Oleg
06.09.2016
13:11:23

Eto
06.09.2016
13:11:42
По-моему я такое в phobos видел.

Dmitry
06.09.2016
13:11:56
а как он должен был делать? Через Enum'ы?

Oleg
06.09.2016
13:12:03

Oleg
06.09.2016
13:12:16
ну в функцию можно вынести маленькую
if (isSuccessCode(code)) { ... }

Eto
06.09.2016
13:12:33
Иной вариант:
if (code >= 200 && code <= 299)
Вариант с функцией, кстати, тоже хорош. Более читаем.

Oleg
06.09.2016
13:13:50
тем более они в d инлайнятся сами, так что накладных минимум

Dmitry
06.09.2016
13:13:57
щас посмотрю как в vibed сделано

Oleg
06.09.2016
13:14:13
не везде где сделано будет не дичь)))
это как "курить плохо"

Google

Oleg
06.09.2016
13:14:42
и все такие "да, да, конечно..."
а потом за угол курить =)

Dmitry
06.09.2016
13:15:03
https://github.com/rejectedsoftware/vibe.d/blob/b7c408b98f369920d85454be6156ba13abadcbb6/source/vibe/core/drivers/threadedfile.d#L46
тоесть по уму нужно назначить на все цифры текстовые кода и потом уже проверять их?

Anatoly
06.09.2016
13:15:50
вот этот код похож на выжимку из Boost.Asio

Eto
06.09.2016
13:16:14

Oleg
06.09.2016
13:16:24

Eto
06.09.2016
13:17:38

Admin
ERROR: S client not available

Anatoly
06.09.2016
13:17:54
там, насколько я помню коды ошибок надо было свести из MSDN и POSIX
у них названия одинаковые, а коды отличались
хотя, это бы любой делал, кто кроссплатформенно пишет что-то, что работает с сокетами
а, это не тот файл)
тут с файлами работа, ошибся
в общем, коды ошибок с именами - хорошо, особенно, если наружу это выглядывает
а так я любой код могу свести к операции над числом 42
хотя есть контекст

Oleg
06.09.2016
13:21:29

Google

Dmitry
06.09.2016
13:23:47
http://www.everfall.com/paste/id.php?jsdmsjcvfbia блок try-catch выкинуть можно?

Eto
06.09.2016
13:25:16
Видимо rq.post никогда не кидает исключений. То можно убрать.
В success блоке можешь добавить continue в конец.

Dmitry
06.09.2016
13:26:07
а что оно даст?

Eto
06.09.2016
13:26:31
А ты мне скажи.

Dmitry
06.09.2016
13:27:41
ну по идее оно к следующему файлу перейдет не обрабатываю дальнейшие команды типа:
if(rs.code == 452)

Eto
06.09.2016
13:28:43
Если бы ты else if использовал, то не перешло бы.
А, 452? Так зачем тебе его проверять, если ты уже знаешь, что у тебя 250?

Dmitry
06.09.2016
13:30:36
так может так тогда сделать? http://www.everfall.com/paste/id.php?j8iyzwvhmcs3
типа если не 250 то что-то другое

Eto
06.09.2016
13:31:13
Можно так.

Anatoly
06.09.2016
13:33:29
а потом, через год, всё-всё-всё переписать =)

Dmitry
06.09.2016
13:36:01
Так. А вот теперь интересный момент.
Из БД я беру путь из которого нужно скопировать все файлы. Сейчас мой код делаем апдейт, при копировании единичного файла, а не всей папки. Получается мне как-то нужно обновить состояние на успех при копировании последнего файла, верно?
вопрос только — как это сделать то? Разве в foreach можно как-то отловить последий файл

Anatoly
06.09.2016
13:37:19
есть for =)
есть индекс в форыче вроде бы ещё

Eto
06.09.2016
13:37:34
И переменные вне foreach.
И вообще я ничего не понял.

Dmitry
06.09.2016
13:38:23
Я беру из БД путь. Получаю из пути список файлов. файлы по одному копирую на FTP.

Anatoly
06.09.2016
13:38:29
https://dlang.org/spec/statement.html#ForeachStatement

Oleg
06.09.2016
13:38:40
https://dlang.org/phobos/std_range_interfaces.html#.InputRange.moveFront
кто-нибудь знает, что этот метод должен делать по логике?

Eto
06.09.2016
13:38:56