#class #groovy #parameters
#класс #groovy #параметры
Вопрос:
Допустим, у меня есть следующий фрагмент кода groovy:
def weightArg = args[0]
class Box {
def width
def height
def double weight() {
//I want to return the value of weightArg here. How can I do that?
}
}
Я хочу, чтобы мой класс Box
использовал некоторые переменные из своего окружения. Как правильно это сделать?
Кажется, это weightArg
должно быть статическим, и я должен иметь возможность получить его из Box
статического инициализатора, но мне не удается преодолеть компилятор.
Ответ №1:
Независимо от того, «правильно» это делать или нет, способ получить доступ к переменной weight из класса Box — это просто удалить слово «def». Причина этого описана здесь .
Ответ №2:
Объявление класса в середине скрипта и его зависимость от локальных переменных скрипта является явным признаком плохого дизайна. Если вы не можете спроектировать всю эту систему в OO, тогда придерживайтесь процедурного программирования. Основная цель написания OO-программ — разложить их на небольшие независимые части. В вашем случае это не является ни факторингом, ни независимым, и я почти уверен, что у него нет цели, которую вы могли бы выразить словами.
Другими словами, либо вообще не объявляйте Box
тип, либо делайте это примерно так:
class Box {
Box(weight) { this.weight = weight }
def width, height, weight
}
И используйте это так:
def box = new Box(args[0])
Таким образом, вы абстрагируетесь от weightArg
args[0]
него, а также получаете возможность повторно использовать его в разных сценариях.
В противном случае вы сделаете свою программу неуправляемой и, следовательно, мертвой после первой ревизии. За десятилетия существования OO-программирования это было в значительной степени доказано.
Еще одна вещь, которую следует отметить, это то, что когда вы чувствуете, что вам нужно ввести классы в свой скрипт, это надежный признак того, что ваша программа должна быть написана как обычное приложение с пакетами и прочим, а не как скрипт.
Комментарии:
1. спасибо за такой подробный ответ! У меня довольно хороший опыт работы с Java, но я новичок в Groovy. Итак, я экспериментирую с смешиванием парадигм. Я не уверен, где должен быть объявлен метод ‘weight’. Раньше в Java я все делал методом, но теперь я думаю, что создание замыкания с параметром curried будет выглядеть более простым.
2. Будучи разработчиком Java, вы уже знаете почти все, что вам нужно о программировании в Groovy. Просто сделайте это так, как вы привыкли, и просто замените шаблонный код Java краткими решениями groovy. Не пытайтесь найти какие-либо лучшие парадигмы, потому что их нет. Скрипты Groovy предназначены для действительно простых вещей, которые, вы уверены, вам не нужно тестировать, и вы пишете их за полчаса. Для вашего случая я бы рекомендовал написать исполняемый класс со стандартным
main
методом и использовать библиотеку args4j.