Информация об изменениях

Сообщение Re[9]: а как Вам такой кусочек кода ? от 30.12.2021 0:51

Изменено 30.12.2021 1:11 Pavel Dvorkin

Re[9]: а как Вам такой кусочек кода ?
Здравствуйте, alzt, Вы писали:

PD>>А также если это математический или физический расчет и есть общепринятые обозначения


PD>>

PD>>double x = -p/2 + sqrt(p*p/4 - q)

PD>>


PD>>лучше чем что-то иное.


A>Не лучше. Я не понимаю, что здесь происходит. И вообще не факт, что я не буду следующим, кто будет вынужден этот код поддерживать.

A>И будет сильно лучше для всех, если этот код будет выглядеть так:

PD>>
A>double someFuncWithClearName(double p, double q) {
A>    return -p/2 + sqrt(p*p/4 - q);
A>}

PD>>double x = someFuncWithClearName(p, q);
PD>>


A>В целом это похоже на создание касты "для тех кто понимет, что здесь происходит".

A>Математики тоже могут так загадить код, что потом сами перестанут понимать что происходит и где какая известная для них функция используется. И наверняка эта формула там не один раз встречается. Если где-то есть ошибка, то её надо будет искать везде.
A>Если захочется поменять формулу по каким-то причинам, то тоже придётся её везде искать, вместо того, чтобы исправить в одном месте.

Хороший пример, на нем как раз можно продемонстрировать, что в разных случаях возможны разные решения.

Дело в том, что твоя someFuncWithClearName вычисляет только x1. А еще есть x2, вычисляемый почти по той же формуле.
Делать 2 штуки someFuncWithClearName1 и someFuncWithClearName2 довольно глупо — зачем деление и sqrt 2 раза производить ?
Делать одну someFuncWithClearName с дополнительным параметром типа boolean, например — можно, но будут лишние if и понятнее не будет, скорее наоборот.
Делать метод, который вернет их оба — можно, но результат будет типа какой то pair или tuple, а это скорее всего класс, и значит, выделение памяти в куче, boxing и потом unboxing, что тут вообще-то совсем ни к чему.
И наконец, что если в каком-то месте мне нужен только x1, а x2 совсем не нужен ? А в другом только x2, а x1 не нужен ? Лишнюю работу выполнять незачем, и будет это не понятнее, а наоборот — придется объяснять в виде комментария, зачем мы возвращаем то, что нам не нужно.

Так что все зависит от ситуации. Если это делается в самых разных местах, и всегда нужна пара, и нет проблем из-за boxing — может и стоит сделать какой-то метод. А иначе лучше просто написать


double t = -p/2;
double s = sqrt(t1-q);
double x1 = t+s;
double x2 = t-s;

double x = -p/2 + sqrt(p*p/4 - q)


и все. И это будет понятнее.
Re[9]: а как Вам такой кусочек кода ?
Здравствуйте, alzt, Вы писали:

PD>>А также если это математический или физический расчет и есть общепринятые обозначения


PD>>

PD>>double x = -p/2 + sqrt(p*p/4 - q)

PD>>


PD>>лучше чем что-то иное.


A>Не лучше. Я не понимаю, что здесь происходит. И вообще не факт, что я не буду следующим, кто будет вынужден этот код поддерживать.

A>И будет сильно лучше для всех, если этот код будет выглядеть так:

PD>>
A>double someFuncWithClearName(double p, double q) {
A>    return -p/2 + sqrt(p*p/4 - q);
A>}

PD>>double x = someFuncWithClearName(p, q);
PD>>


A>В целом это похоже на создание касты "для тех кто понимет, что здесь происходит".

A>Математики тоже могут так загадить код, что потом сами перестанут понимать что происходит и где какая известная для них функция используется. И наверняка эта формула там не один раз встречается. Если где-то есть ошибка, то её надо будет искать везде.
A>Если захочется поменять формулу по каким-то причинам, то тоже придётся её везде искать, вместо того, чтобы исправить в одном месте.

Хороший пример, на нем как раз можно продемонстрировать, что в разных случаях возможны разные решения.

Дело в том, что твоя someFuncWithClearName вычисляет только x1. А еще есть x2, вычисляемый почти по той же формуле.
Делать 2 штуки someFuncWithClearName1 и someFuncWithClearName2 довольно глупо — зачем деление и sqrt 2 раза производить ?
Делать одну someFuncWithClearName с дополнительным параметром типа boolean, например — можно, но будут лишние if и опять же 2 раза вычисление sqrt. И понятнее не будет, скорее наоборот.
Делать метод, который вернет их оба — можно, но результат будет типа какой то pair или tuple, а это скорее всего класс, и значит, выделение памяти в куче, boxing и потом unboxing, что тут вообще-то совсем ни к чему.
И наконец, что если в каком-то месте мне нужен только x1, а x2 совсем не нужен ? А в другом только x2, а x1 не нужен ? Лишнюю работу выполнять незачем, и будет это не понятнее, а наоборот — придется объяснять в виде комментария, зачем мы возвращаем то, что нам не нужно.

Так что все зависит от ситуации. Если это делается в самых разных местах, и всегда нужна пара, и нет проблем из-за boxing — может и стоит сделать какой-то метод. А иначе лучше просто написать


double t = -p/2;
double s = sqrt(t1-q);
double x1 = t+s;
double x2 = t-s;

double x = -p/2 + sqrt(p*p/4 - q)


и все. И это будет понятнее.