↓
 ↑
Регистрация
Имя/email

Пароль

 
Войти при помощи
Styx
25 августа 2019
Aa Aa
#кодерское #swift

Обожаю Swift :)

25 августа 2019
66 комментариев
Ластро
Жестоко
Ластро
Это такую хрень можно в любое место кода добавить и потому начнутся чедеса?
Ластро
Жесть, как она есть.
Ал Ластор, а можно и так :)

Ластро
Ну это таки нормально воспринимается, но вот изначальный пример...

Кстати, такой вопрос, а эти расширения влияют на весь код или только внутри модуля/ниже по тексту?
FluktLight
Это очень сильное колдунство..
Ластро
FluktLight, я бы сказал, что это чернейшая магия...
Ал Ластор, на весь код, в этом вся прелесть. Можно экстендить даже классы/протоколы из подгруженных либ :)
Чувствую себя злобным луддитом.
Все эти новомодные переносы строк и отступы вместо богоугодной точки с запятой...
Хорошо что хотя бы фигурные скобки остались :-))))
По-моему, это должно быть в списке запрещённых заклинаний...
Ластро
Styx, а экстендятся они везде или только в твоём коде/модуле? Вот в чём фокус.
Ал Ластор, везде. В этом вся прелесть :)
FluktLight
Ал Ластор
Чернее черного...
Ластро
Эта нифига не прикольно. Одно дело применить такое колдунство в одном модуле, а другое во всей программе...
miledinecromant, отступы необязательны, но если несколько команд на одной строке — разделяются точкой с запятой, как обычно.
Ластро
Это же страшнейшее нарушение принципа инкапсуляции!
Ал Ластор, ну как сказать. Возможность расширить/переопределить методы или даже операторы стандартных классов (или любых других) — мощнейшая штука.
Styx
А что с выделением памяти и сборщиками мусора? (Я из тех динозавров, которые до сих пор негодуют как в том же пехепе можно к строчке массив присвоить)
Ал Ластор, и как это нарушает принцип инкапсуляции?
Ластро
Styx, я не спорю, но одно дело, когда ты это делаешь в локальной песочнице, а другое дело, когда во всём коде. Я бы может хотел бы переопределить их двумя разными способами. Но из-за такой глобальности не это не получится.
Ластро
А разве ты не можешь расширенным методом залезть в приватное поле?
Ал Ластор, так этот метод уже классу будет принадлежать, как будто он там был изначально.
Ластро
То есть приватность полей похерена. Просто замечательно...
FluktLight
Большая сила несёт большую ответственность...
Ал Ластор, да чего же она похерена? Родной метод (а он становится таковым) класса имеет доступ к приватному полю, как и должно быть.
Ластро
Родной метод, это тот который написан и оттестирован рядом с классом в одном модуле, а вот эти пристройки они отнюдь не родные. Не зря когда-то придумали словечко protected как раз, чтобы всяки особо хитрые не залазили куда не нужно.
Поясните на пальцах для человека постороннего: чтобы Нео делал с Матрицей плохие вещи, в Матрице должны быть дыры, а у Нео - права в них лазить?
FluktLight
Lothraxi
С какой именно матрицей?
Забавно, а зачем они вообще от дали переопределять стандартные функции и операторы?
Ал Ластор, это ты уже передёргиваешь. Если есть класс с protected свойствами, и я (посторонний чувак) наследую от этого класса и мои методы туда лазят — это тоже нарушение инкапсуляции? Мой код же не оттестирован рядом с этим классом в одном модуле.

Зато расширения позволяют сделать такое (как пример):

FluktLight
Styx
На костёр!
EnGhost, потому что они не "стандартные", а такие же классы/методы/операторы, как и все остальные :)
1. Можно переопределять операторы класс/структур (как и в С)
2. Можно расширять существующие классы/структуры/протоколы.
Ну и вот :)
Lothraxi, достаточно чего-то одного: или дыра, или права лазить :)
В С сколько мне помнится не Все можно было переопределять.
EnGhost, я уже точно не помню, но кажется все. Зато в Swift можно свои операторы добавлять :)
Styx
Спс!
Ал Ластор, ой-ой, сорри, я тебе наврал. Расширение (класса/структуры) будет иметь доступ к приватным полям только если это разрешено самим классом/структурой. Если там установлен уровень access control = private — то расширение сможет добавлять новые методы или поля, но не будет иметь доступ к приватным.
Ал Ластор, вернее даже не так, только если это специально разрешено. По умолчанию уровень доступа: internal
Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.
Мдя
Lucia Malfoy
got a brain cancer from reading the comments

+аластор дохера консервативный
Я думаю, не только он.
Ластро
Lucia Malfoy, просто у всякого приёма есть своя область применения, и одно дело, когда ты пишешь код в одиночку тысяч на пять, тогда такая гибкость только в плюс, а когда вас на проекте уже хотя бы человек пять, и кода строчек тысяч сто, то то что выше станет источником таких лулзов, что вы там все поседеете. Ибо ситуация, когда внезапно ломается давно написанный и протестированный код от того, что кто-то решил что-то там переопределить выглядит мягко-говоря не здорово.

Я же специально переспросил по поводу всевозможных методов ограничить зоны видимости этих эффектов. Потому что в локальном рабочем пространстве, это действительно может быть удобно. Но в глобальном пространстве большого проекта – это ад.

Впрочем, всё выше написанное является лютым имхо.
Ал Ластор, нет, ты отчасти прав, тут не спорю. Это я тебя ввёл в заблуждение немного. Если интересно, вот тут можно почитать про ограничения.
Ал Ластор
Свифт всё-таки не то чтобы рассчитан на огромные проекты.
Lucia Malfoy
Ал Ластор
100к бтв не так много

>Ибо ситуация, когда внезапно ломается давно написанный и протестированный код

у тебя ручные тестировщики что ли?
Ластро
Авто тесты, у меня. Но тесты всё не покрывают в принципе. Априори. И ситуация, когда добавляется тест через месяц-два на какой-нибудь класс, чтобы покрыть ранее незамеченный косяк — это отнюдь не фантастика.

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

> 100к бтв не так много
Не спорю...
Lucia Malfoy
>И искать по всему проекту источник счастья?
чо
это тебе не дефайны
Lucia Malfoy
или у тебя блокнот вместо ide
Ластро
Lucia Malfoy, нормальная у меня ide. Стандартная для qt-шечки.

А вообще, по хорошему, такая хрень отсекается на кодревью...
Lucia Malfoy
Ал Ластор
такая хрень
документируется дополнительно (если там чото мутное)
и кладётся куда надо
например, в один неймспейс/пакет/файл/директорию/whatever
Lucia Malfoy
токсичные ревьюеры ненужны
Ластро
> например, в один неймспейс
А тепереь перечитай мои посты, ибо...
>Я же специально переспросил по поводу всевозможных методов ограничить зоны видимости этих эффектов.

В общем предлагаю свернуть тему, ибо каждый останется при своём. А желания продолжать нет.
Lucia Malfoy
Ал Ластор
ограничение скоупа как раз вызывает больше втф
Ластро
Lucia Malfoy, токсичные нет, хорошие, на вес золота.
Lucia Malfoy
уровня я не осилил, удоли
когда это чото простое
Ластро
> ограничение скоупа как раз вызывает больше втф
Чего? Впрочем не буду спорить.
Lucia Malfoy
Ал Ластор
у тебя в разных местах проекта будет разное поведение

в этом скоупе 2+2 = 4
в этом 2 + 2 = 5
потом ты передаешь (например, как аргумент) в другой скоуп, и всё ещё веселее
FluktLight
Lucia Malfoy
А разве не лучше будет если каждый кодер будет творить свою, кхуйню в тщательно огороженном месте?
Ибо если кхуйня будет глобальной, то при наличии нескольких подобных образуется мегакхуйня...
Lucia Malfoy
FluktLight
> А разве не лучше будет если каждый кодер будет творить свою, кхуйню в тщательно огороженном месте?

имхо это признак того, что на проекте ебанина и пора сваливать
в рамках одного проекта/монолита это холодная война какая=то) с говнокодом и лютиками
пилите пикосервисы тогда и общайтесь через шины/rpc/etc., если можете

> Ибо если кхуйня будет глобальной, то при наличии нескольких подобных образуется мегакхуйня...
ну так пообщайтесь друг с другом))
Ластро
FluktLight, угу, а потом хуйня планово очищается, если уж она образовалась, по локальным резервациям.
Ластро
>в рамках одного проекта/монолита
Это называется управление сложностью.
Lucia Malfoy
Ал Ластор
это называется пора валить
тик так ходики калеги додики
ПОИСК
ФАНФИКОВ









Закрыть
Закрыть
Закрыть