Как получить доступ к объявленным полям скрипта из классов в Groovy?

#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.