Aleh
13.01.2018
00:31:14
а набор методов это просто все юзкейсы, и там еще что-нибудь про каплинг и кохижн
da horsie
13.01.2018
00:32:10
тоже делать статическим?
ну вроде какой-нить public toName(): string
Google
da horsie
13.01.2018
00:33:01
имя задано раз и на всегда
весь метод это одна строка return "foofoo";
Aleh
13.01.2018
00:34:21
не видел кейсов кроме именованого конструктора для статики других
Sergei
13.01.2018
00:34:24
Хммммм... то есть это foofoo - оно одинаковое для всех экземпляров?
Aleh
13.01.2018
00:34:33
писать просто статик, если в методе нет this - оч дурная затея кмк
da horsie
13.01.2018
00:34:52
Sergei
13.01.2018
00:35:53
da horsie
13.01.2018
00:36:42
interface CallableByName { toName(): string; }
много реализаций
вроде class Foo implements CallableByName
toName() { return 'foo'; }
статикой делать?
toName - очевидно часть public contract
Google
da horsie
13.01.2018
00:39:17
может ли статический метод быть часть контракта?
по-моему что-то тут не так
Sergei
13.01.2018
00:51:22
может ли статический метод быть часть контракта?
Давай посмотрим на это с другой перспективы: вот есть код, который по своей логике никак не связан с каким-либо экземпляром класса.
Из каких соображений мы могли бы его объявить НЕ static, и зачем мы стали бы всегда передавать в него бесполезный и нерелевантный аргумент (this)?
da horsie
13.01.2018
00:52:36
почему у меня должна об этом голова болеть?
Sergei
13.01.2018
00:53:20
da horsie
13.01.2018
00:53:57
в большинстве языков this передается неявно, сигнатура снаружи не меняется
честно сказать, я, кроме питона таких и не знаю
Aleh
13.01.2018
00:55:19
da horsie
13.01.2018
00:55:51
Aleh
13.01.2018
00:57:35
da horsie
13.01.2018
00:57:59
Aleh
13.01.2018
00:58:39
Если он по логике модели у объекта, а по реализации не использует this, то ну и ладно. А если никак не относится, то делая его статическим делаете только хуже
Sergei
13.01.2018
00:59:00
в большинстве языков this передается неявно, сигнатура снаружи не меняется
Не совсем. Точнее да, всё верно - this кладётся на стек молча, незаметно для разработчика. Но это всё равно означает, что такой параметр передан.
Положим, сегодня мой метод foo(int x) не использует this - у метода фактически один аргумент. Завтра я решил внутри foo(int x) использовать this - теперь у foo два фактических аргумента. Сигнатура изменилась, хотя он как в коде был foo(int x) так и остался - но foo "вчера" уже незримо несовместим с foo "сегодня". Имхо это причина, почему компилятор не может сам решать куда расставлять static.
da horsie
13.01.2018
00:59:57
ни про стеки ни про какие другие оптимизации не хочу знать
у нас же язык высокого уровня
Aleh
13.01.2018
01:01:34
da horsie
13.01.2018
01:02:09
ну Серега наверно имеет в виду какую-нить совместимость на уровне байт-кода
Google
da horsie
13.01.2018
01:02:23
но мне на нее пофигу должно быть, как разработчику
тот же питон - хороший пример. язык как контракт, а не как реализация
Aleh
13.01.2018
01:04:10
не понял про питон
da horsie
13.01.2018
01:04:16
с наследование опять же возникают сложности. если в предке у меня статический метод, я в наследнике могу его сделать НЕстатическим?
Aleh
13.01.2018
01:04:41
расширять вход и сужать выход
da horsie
13.01.2018
01:07:27
не понял про питон
ну есть питон как стандарт языка, а есть конкретные имплементации. python vs cpython
а когда речь про джаву, то чаще всего имеют в виду jvm
то есть внутренняя кухня имеет значение
Aleh
13.01.2018
01:09:06
это нормально для промышленных инструментов
da horsie
13.01.2018
01:09:46
а у предка уже статический метод нарисовался
Aleh
13.01.2018
01:10:12
не использовать наследование ?
тебе даровали структурные типы
зачем тебе иерархии
da horsie
13.01.2018
01:11:57
ну блин
наследование - один из столпов ооп, опять же в "обычном" понимании
плохо оно или нет, это отдельный вопрос
Aleh
13.01.2018
01:13:04
наследуй интерфейсы и наследуйся от них
Google
Aleh
13.01.2018
01:13:13
не наследуй реализации
da horsie
13.01.2018
01:13:15
но статика мешает наследованию, получается
Sergei
13.01.2018
01:13:16
da horsie
13.01.2018
01:13:53
оять же ты смотришь с точки зрения компилятора
а я - с точки зрения пользователя
Sergei
13.01.2018
01:20:00
оять же ты смотришь с точки зрения компилятора
Мммм согласен примерно на 78%. Но всё же (имхо) декларация static - это часть логики, а не реализации, и (опять же в моем понимании) означает декларацию/обещание "этот код по своей логике не требует и никогда не будет требовать знать state экземпляра". Примерно как int foo(string) значит "foo всегда будет ждать строку на входе и всегда возвращать число на выходе". В этой декларации нет ни порока, ни добродетели - есть лишь свойства.
И если язык поддерживает такую семантику, и мы ей воспользовались - мы же должны ей и соответствовать.
da horsie
13.01.2018
01:23:09
чтобы юзать статик должны быть более веские причины, чем техническое неиспользование this.
семантика какая-то должна присутствовать
Sergei
13.01.2018
01:25:24
This - это открытие доступа методу к state объекта. Далёкая аналогия - это как сделать метод public.
Иными словами, _отсутствие_ static (как и отсутствие private) должно быть как-то обосновано. Примерно как говорят "нормальное состояние шлагбаума - закрытое".
О, сейчас.
http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197
Строго говоря, здесь Meyers пишет про non-member functions (because in C++ you can ?) но в большинстве случаев они ведут себя так же, как и static.
da horsie
13.01.2018
01:33:11
нууууууу
class Point {
public:
int getXValue() const;
int getYValue() const;
void setXValue(int newXValue);
void setYValue(int newYValue);
private:
... // whatever...
};
для начала я бы не называл вот это инкапсуляцией
Still, it seems clear that the class is more encapsulated than the struct, and we'd like to have a way to state this more formally. - не согласен вообще
Sergei
13.01.2018
01:35:57
da horsie
13.01.2018
01:36:03
ладно бы было что-то вроде point.moveTo() или point.printOnCanvas(canvas)
Google
Sergei
13.01.2018
01:36:48
Да, согласен. Но как мне кажется все остальные выводы оно не особо изменит.
da horsie
13.01.2018
01:37:00
ну я к тому, что обсуждать тезис "статика помогает инкапсуляции" становится бессмысленно, если мы под инкапсуляцией понимаем разные вещи
но я не дочитал еще, погоди
Sergei
13.01.2018
01:37:32
Мммм а что мы понимаем под инкапсуляцией?
da horsie
13.01.2018
01:38:34
ну то есть вместо того, чтобы иметь cat.eat(food) мы делаем cat.getStomach().contents = food
это не инкапсуляуция
cat.walkto(point) это инкапсуляция. cat.position.x = 42 это не инкапсуляция
use of non-friend non-member functions improves a class's encapsulation, and a preference for such functions over member functions makes it easier to design and develop classes with interfaces that are complete and minimal (or close to minimal).
ну это и ежу понятно
не надо создавать члены класса, если они не нужны
Sergei
13.01.2018
01:46:45
я понимаю сокрытие стейта и деталей реализации. геттеры и сеттеры этого не делают
Моё понимание инкапсуляции: пусть есть объект с реализованным состоянием, и есть гора разного кода, который так или иначе на это состояние влияет.
Мы взяли и изменили реализацию состояния объекта (например оказалось что удобнее хранить не декартовы, а полярные координаты точки).
Так вот инкапсулированность - это мера количества изменений, которые потребуется внести во весь окружающий код, чтобы он снова заработал корректно.
da horsie
13.01.2018
01:46:53
все же мне кажется, он там не совсем за статику топит
Sergei
13.01.2018
01:47:19
То есть - делайте static или non-member (если ваш язык позволяет).
da horsie
13.01.2018
01:51:02
это достаточно серьезная причина?
в сях я могу вызвать статический метод у экземпляра класса?
Sergei
13.01.2018
01:54:25
Нет конечно. Потому как в статическом методе у тебя нет "слота" для передачи this.
da horsie
13.01.2018
01:54:38
а
Sergei
13.01.2018
01:54:41
Методы класса вызываются у класса.