
Dmitry
21.11.2016
19:53:13
Денис, а нет идей что оно может падать то

Денис
21.11.2016
19:57:37
Денис, а нет идей что оно может падать то
Хз. Надо поглядеть, что сервер самой базы говорит. В логах или в консоль он должен печатать, что дескать ждём подключения по такому-то порту и можно посмотреть пыталось ли приложение законнектиться или даже не дошло до этого.
'''
if(conn !is null)
{
conn = ds.getConnection();
}
'''
Сдаётся мне что тут логический косяк

Google

Денис
21.11.2016
20:10:59
Чому conn получает коннекшн, если оно не нуль
То есть изначально оно нуль и получается этот самый коннекшн никогда и не получит

Pavel
21.11.2016
20:11:54
!is -> is

Dmitry
21.11.2016
20:15:37
Денис, ты походу прав тк падать начало после переделки этого места
Завтра вечером смогу проверить
Да. Походу так и естт
А такие ошибки как отлавливать?

Oleg
21.11.2016
20:18:00

Dmitry
21.11.2016
20:18:53
Ну да. Тут же трай-кетч не поможет

Oleg
21.11.2016
20:29:31
пиши тесты
на каждую строчку
а сколько покрыл тестами можно проверить с помощью coverage функции компилятора

Dmitry
22.11.2016
04:45:25
А суть теста в чем. Я много про них читал и понимаю их определение. Но я не могу понять как они от логических ошибок могут защитить?

Google

Dmitry
22.11.2016
04:45:58
Я же в тесте бы по инерции тоже самое бы написал

qwe
22.11.2016
06:09:10
В D и так полно вещей, чтоб сделать безопасный читаемый код. Есть еще такая вещь, называется статический анализатор, но у D их пока нет кажется

Oleg
22.11.2016
06:57:18

qwe
22.11.2016
07:20:37
я имел ввиду что-нибудь уровня pvs studio)

Oleg
22.11.2016
08:10:13
да я понял... pvs studio не пользовался, но читал несколько раз про продукт. Мне кажется подобные вещи должны быть сразу в компиляторе. Для D отчасти это так. Например @safe режим, или pure некоторые вещи запрещают, да и сам язык не поддерживает некоторых закидонов, которые в C++ можно делать.
элементарно присвоение в if нельзя делать
но создавать переменные можно

qwe
22.11.2016
08:13:15
что-то я не понял как создавать переменные без присвоения
нельзя присваивать уже созданным перенным что-нибудь?

Oleg
22.11.2016
08:13:40
1 сек
import std.stdio;
void main()
{
auto a = 5;
//if (a = 6)
// writeln("oops");
auto list = ["yes" : 1, "no" : 0];
if (auto x = "yes" in list)
writeln(x);
}
закоментированные строки не компилятся с ошибкой вида "нельзя присваивать в выражении if, возможно вы имели ввиду ==", а во втором случае в x будет лежать не null адрес

qwe
22.11.2016
08:17:50
да, я так и подумал
круто
не нужен йода style)
хотя интересно насколько это увеличивает время компиляции
некоторые вещи все-таки не хотелось бы решать компилятором, а отдельным инструментом

Oleg
22.11.2016
08:20:33
по мне так главное чтобы читать было удобно и работало в итоге быстро
время компиляции очень сильно увеличивается если есть инстанцирование шаблонов, которые используют mixin'ы

Google

Oleg
22.11.2016
08:22:21
там и памяти можно выжрать прилично

qwe
22.11.2016
08:23:02
я понял

Oleg
22.11.2016
08:24:01

qwe
22.11.2016
08:25:41
что-то совсем грустно

Oleg
22.11.2016
08:30:19
да я сам дурак) просто грустно, что если это не входит в оперативу нет возможности это как-то кэшировать на диск средствами компилятора, только через swap системы, который у меня отключен (ssd портить не хочу лишний раз)

qwe
22.11.2016
08:42:10
6 гб все равно много
мне кажется я когда на UE4 что-то собираю, столько не съедается RAM
на C++ разумеется

Oleg
22.11.2016
08:42:56
ну так С++ же
там каждый файл отдельно компилируется в объектный
а в D принято всё вместе собирать
а ты хорошо ue4 знаешь?

qwe
22.11.2016
08:44:29
не, плагин один с горем пополам поддерживаю для ИК)
время на это надо

Oleg
22.11.2016
08:44:51
что есть ИК?
инфракрасный порт?)

qwe
22.11.2016
08:45:10
инверсивная кинематика
)

Oleg
22.11.2016
08:45:15
воу

Grigirii
22.11.2016
08:50:50
Я же в тесте бы по инерции тоже самое бы написал
TDD говорит, что сначала пишется тест, потом проверяется, что он не проходит, а потом уже пишется код. По факту удобнее сначала накидать скелет реализации и интерфейс, потом написать тесты и потом реализацию.

Google

Армен
22.11.2016
10:44:39
Всем привет! Есть такой код:
import std.stdio;
enum Color { blue, green, red };
class Point {
int x;
int y;
Color color;
this(int x, int y, Color) {
this.x = x;
this.y = y;
this.color = color;
}
bool opEquals()(auto ref const Point rhs) {
if((this.x == rhs.x) && (this.y == rhs.y)) {
return true;
}
else
return false;
}
}
void main()
{
auto x = new Point(3, 2, Color.red);
auto c = new Point(3, 2, Color.red);
writeln(x == c);
}
из учебника али чехрелли. он в данном случае выдает False вместо true. Если x == c заменить на x.opEquals(c), то срабатывает правильно
это глюк или я накосячил?

Oleg
22.11.2016
10:46:10
операция == должна вызывать opEquals, но возможно тут сравнивает адреса
для сравнения адресов используется is

Армен
22.11.2016
10:46:55
мне тоже так показалось
x!=c - выдает true. по ходу, адреса сравнивает

Oleg
22.11.2016
10:48:02
попробуй убрать шаблонизацию

Admin
ERROR: S client not available

Oleg
22.11.2016
10:48:14
auto ref const на ref const
и скобки пустые
и лучше для класса поставить overload
auto ref в случае с классом не оправдан, класс всегда передаётся по ссылке
возможно в твоём случае не происходит перегрузки
вернее её точно не происходит
шаблонный же метод
https://dlang.org/spec/operatoroverloading.html#equals
для структур можно разное делать, а для класса видимо нет

Google

Oleg
22.11.2016
10:51:36
хотя...
можно сделать такой хак
class Point {
...
override bool opEquals(Object obj) {
if (auto p = cast(Point)obj)
return opEquals(p);
else
return super.opEquals(obj);
}
...
}

Grigirii
22.11.2016
10:56:36
вот только хотел написать. для классов надо делать с override и без шаблона. для структур не оверрайд и как хочешь. но выглядит всё равно криво

Oleg
22.11.2016
10:57:15
согласен, как-то раньше не натыкался на сравнение классов...
ну если только по адрессу

Grigirii
22.11.2016
10:58:15
самое странное, что при нарушении сигнатуры или сужении компилятор не ругается на override. если писать
public override bool opEquals()(Point rhs) {
это вообще компилиться не должно, но компилится и просто не вызывается

Oleg
22.11.2016
10:58:44
по сути то это не компилится)
шаблонные методы инстанцируются только если вызываются

Армен
22.11.2016
10:59:03
Просто без шаблона и override не компилится, да

Oleg
22.11.2016
10:59:55
то есть компилятор видит, что есть достаточно конкретный opEquals в базовом классе, вставляет его , а до нового с шаблоном не доходит
вот он и не инстанцируется
следовательно не компилится
а override с шаблонами использовать, к сожалению, нельзя
на то есть веские причины, хотя иногда было бы оч удобно

Grigirii
22.11.2016
11:00:45
а у меня почему-то во всех вариациях компилится. DMD 2.070.0. видимо пора обновляться

Oleg
22.11.2016
11:01:09

Армен
22.11.2016
11:01:27
Получается, только с приведением?

Oleg
22.11.2016
11:01:40
если вставить туда pragma(msg, "..."), не должно вывестись
зачем точка — класс?

Армен
22.11.2016
11:03:48
Это из упражнения) Реально решение через cast только.

Grigirii
22.11.2016
11:09:07
впринципе в доке действительно всё так:
https://dlang.org/spec/operatoroverloading.html#equals