Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ты, например, пишешь генератор случайных имен. Ты записал имена в текстовый файл. У тебя есть класс TextFileStorage, который берет все возможные имена из файла и возвращает массив имен. Через месяц ты решил получать имена с какого-нибудь сайта. Для этого тебе надо не только написать новый класс WebsiteStorage, но и менять код там, где есть обращения к TextFileStorage. Если бы у тебя был интерфейс NameStorage, то тебе было бы достаточно изменить строчку
- > NameStorage nameStorage = new TextFileStorage();
- на
- > NameStorage nameStorage = new WebsiteStorage();
- и все, считай ты внес изменения так, что остальные компоненты твоего приложения их не заметили.
- Юнит-тесты тоже становятся пизже. Например, у тебя класс NameGenerator в конструкторе принимает NameStorage. Если ты во всех юнит-тестах пишешь
- > NameGenerator nameGenerator = new NameGenerator(new TextFileStorage());
- то, когда ты сменишь TextFileStorage на WebsiteStorage, все твои тесты сломаются и тебе придется везде менять
- > new TextFileStorage()
- на
- > new WebsiteStorage().
- Кроме того, если ты случайно сломаешь TextFileStorage или WebsiteStorage, то есть вероятность, что тесты NameGenerator у тебя тоже сломаются и тебе будет сложнее понять, что ошибка не в NameGenerator, а в NameStorage. Чтобы такого не было, ты можешь в конструктор передавать инстанс интерфейса NameStorage, у которого метод getNames() не будет лезть на сайт или в текстовый файл, а будет просто возвращать массив ["хуй", "пизда", "сковорода"], чтобы ты мог нормально тестить только NameGenerator, а не другие классы.
- Ты спросишь: "Схуяли я буду так часто че-то менять?" Тырпрайзный код очень быстро обрастает новыми фичами и подвергается изменениям, поэтому в тырпрайзе все всегда используют интерфейсы.
Advertisement
Add Comment
Please, Sign In to add comment