Ответ
G_Z 03.11.2015 19:58
/ 03.11.2015 19:59
— У объектов есть поведение (интерефейс). Фактически это жесткий контракт, который жестко фиксирует свойства объекта. Любой, кто взаимодействует с объектом должен иметь гарантию, что контракт не поменяется в процессе взаимодействия с объектом. Манкипатчинг нарушает нарушает контракт и придает объекту свойства, которых у него не было. С точки зрения ООП-подхода это плохо.
Плохо.
Но интерфейс пользовательских объектов может меняться совершенно сводобно хоть после каждого вызова.
Вызывало ли это проблемы хоть раз?
Думаю, нет.
— Допустим, что мы разрешили нарушать контракт. Тогда возникает вопрос: что нам делать, если два объекта добавили в системный класс метод с одним и тем же именем, но с разным интерфейсом (входными и выходными параметрами или логикой получения результата). Мы сразу получили некорректную работу одного из объектов, потому что интерфейс не тот, который он ожидает. Отлаживать такие проблемы будет крайне сложно: понять кто и в каком порядке напихал методы в системные классы та еще задачка.
Да, многократное изменение может быть проблемой.
Её можно решить, к примеру:
1. запретом многократной модификации: меняешь — меняй единожды;
2. возможностью через reflection выяснить были ли изменения.
С учётом того, что при патчинге широко распространена практика предварительной проверки окружения, это опять же не должно стать проблемой.
Лично я не вижу альтернатив патчингу в задаче, когда необходимо расширить интерфейс класса или объекта.
Вот хочу я иметь метод in у каждого объекта.
Для массивов он проверяет наличие элемента, для строк и чисел — наличие подстроки, и так далее.
Метод удобный и с точки зрения главенства интерфейса над классом правильный — я буду работать через метод с объектом, не обращая внимания на его класс.
Даже если будет возможность наследования от нативных классов, я не получу желаемого результата.
Исключительно в случае замены всех нативных методов, возвращающих нативные типы своими наследниками и своими типами.
Задача мне кажется вполне разумной, а инструмента кроме патчинга для ей решения нет.
Возможно я ошибаюсь.
- Parser 3.4.4 RC, moko [M] 27.10.2015 15:16
- Ответ, G_Z [M] 12.11.2015 20:03
- ^hash.sort[key;value]{string-key-maker}[[asc|desc]] — вылезла несовместимость, Sumo [M] 10.11.2015 14:30 / 10.11.2015 14:36
- Ответ, moko [M] 10.11.2015 14:50
- Ответ, moko [M] 10.11.2015 14:36
- Спасибо за проведённую работу!, stur 09.11.2015 10:32
- Обновлнение, Евгений Химич 01.11.2015 23:08
- Класс, Parser стал заметно живее, как проект. (-), andylars 28.10.2015 18:19 / 28.10.2015 18:20
- Ответ, 28.10.2015 18:17
- Unhandled exception 0xC0000005 at 0x1000192A, G_Z [M] 27.10.2015 16:42
- Ответ, moko [M] 27.10.2015 16:56
- Падает на запросе, G_Z [M] 27.10.2015 17:26 / 27.10.2015 17:51
- Ответ, moko [M] 27.10.2015 17:52
- Ответ, G_Z [M] 27.10.2015 17:53
- Ответ, moko [M] 27.10.2015 18:03
- Ответ, G_Z [M] 27.10.2015 18:08
- Ответ, moko [M] 27.10.2015 18:38
- Странно, G_Z [M] 27.10.2015 16:59
- Ура!, G_Z [M] 27.10.2015 15:53
- Ответ, moko [M] 27.10.2015 15:59
- Ответ, G_Z [M] 27.10.2015 16:15
- Ответ, moko [M] 27.10.2015 16:17
- Ответ, G_Z [M] 27.10.2015 16:20