Хорошо, я не пытаюсь начать пламенную войну здесь, и я знаю, что спор между статическими и динамическими языками неоднократно хэшировался, в том числе и здесь. Но у меня есть очень практичный вопрос, который, надеюсь, кто-то здесь сможет пролить немного света. Извините за длину, но это не простой вопрос, возможно, не простой ответ.
Ruby, PHP и Javascript являются довольно популярными языками в наши дни, и у них есть много людей, которые защищают их и утверждают, что динамическая типизация не сдерживает разработчика. Я новичок в этих языках и хотел бы начать использовать их для более крупных проектов, но вот базовый сценарий рефакторинга, который все время возникает на работе (работа == C #), и мне интересно, какой подход будет в Ruby - я выбрал Ruby, потому что это ОО.
Хорошо, я использую Ruby и создаю объект Customer. У него есть методы для загрузки / сохранения / удаления из базы данных. Это хорошо, и люди используют это. Я добавляю больше методов для других вещей, и люди используют это больше. Я добавляю метод для расчета истории заказов на основе некоторых параметров. К настоящему времени этот класс используется во всей системе. Затем однажды я решаю изменить параметры метода GetOrderHistory. Итак, я:
- добавить новые параметры в метод
- переписать код метода для использования новых параметров
- изменить код клиента, который я имел в виду, чтобы передать новые параметры и использовать этот модифицированный метод
Но что теперь? У меня есть десятки / сотни / кто знает, сколько других мест в системе нужно изменить. Как бы я поступил с таким динамическим ОО-языком, как Ruby или Javascript?
От макушки головы, не зная Руби очень хорошо, я могу придумать два глупых ответа:
- 100% код покрытия. Я тестирую все приложение, и каждый раз, когда оно ломается, я вижу, что это тот метод, и исправляю его
- Найти и заменить. Я использую текстовый поиск, чтобы найти этот метод. Но у меня могут быть другие объекты с такими же именами методов.
Так есть ли хороший ответ на это? Кажется, IDE будет трудно. Если бы у меня был код, такой как
c = Customer.new
он мог бы понять это, но что, если это
c= SomeFunctionThatProbablyReturnsACustomerButMightReturnOtherThings()
Так какой подход вы бы выбрали в этом случае для специалистов по Ruby?