Как получить доступ к объявленным полям скрипта из классов в Groovy? - PullRequest
1 голос
/ 14 октября 2011

Допустим, у меня есть следующий фрагмент кода:

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 статического инициализатора, но мне не удается преодолеть компилятор.

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Независимо от того, «правильно» это делать или нет, способ, которым вы можете получить доступ к своей переменной веса из класса Box, - это просто удалить слово «def».Причина, по которой описан здесь .

2 голосов
/ 14 октября 2011

Объявление класса в середине скрипта и его зависимость от скриптов локальными переменными - явный признак плохого дизайна. Если вы не можете спроектировать всю эту систему в оригинальном виде, тогда придерживайтесь процедурного программирования. Основная цель написания ОО-программ - разложить их на маленькие самостоятельные кусочки. В вашем случае это не факторинг и не независимость, и я уверен, что у него нет цели, которую вы могли бы выразить словами.

Другими словами, либо вообще не объявляйте тип Box, либо делайте это так:

class Box {
  Box(weight) { this.weight = weight }
  def width, height, weight
}

И используйте это так:

def box = new Box(args[0])

Таким образом, вы получаете абстракцию от weightArg и args[0], а также можете использовать ее в различных сценариях.

В противном случае вы предопределите, что ваша программа будет неуправляемой и, следовательно, мертвой после первой ревизии. За десятилетия существования ОО-программирования это было в значительной степени доказано.

Еще одна вещь, на которую следует обратить внимание: когда вы чувствуете, что вам нужно ввести классы в ваш скрипт, это надежный признак того, что ваша программа должна быть написана как обычное приложение с пакетами и прочим, а не как скрипт. *

...