Первая полезная программа на Groovy

Когда изучают некий язык программирования и говорят «Давайте рассмотрим простую программу на данном языке», то в качестве примера выбирают какую-нибудь бесполезную задачу типа вывода на экран Hello World или вычисление факториала. Но Groovy — язык для получения быстрых результатов. Ему не свойственна академичность Java. Это, если угодно, средство из серии Quick & Dirty. Зачем тратить время на разбор примеров, если можно сразу, с места в карьер написать что-то полезное? Как раз такая сиюминутная задача и встала передо мной вчера: нужно было организовать шаблон для проектов, т.к. надоело вручную выполнять одни и те же рутинные операции. Итак, от скрипта требовалось:

1. Создать каталог проекта и структуру подкаталогов.
2. В некоторых подкаталогах создать файлы Main.java с содержимым, соответствующим имени проекта.
3. Создать кое-где файлы build.xml, тоже с соответствующими поправками на имя проекта.
3. Создать файл .gitignore.

Вот как это выглядит с точки зрения



#!/usr/bin/groovy

assert args != null       // Проверяем, что скрипту переданы аргументы,
assert args.size() > 0    // т.к. имя проекта - как раз и есть аргумент скрипта

def dir = new File(args[0])  // Каталог проекта

['.output', '.design', '.tmp', 'client', 'server'].each{  // Вот она, знаменитая мощь Groovy при работе со списками!
 def subdir = new File(dir, it)
 subdir.mkdirs()    // Создаем подкаталог для каждого элемента списка
 if(it[0] != '.'){

    // Если имя подкаталога не начинается с точки - пишем в него шаблон программы, 
    // на лету вставляя нужное слово.
    // Тройные кавычки - замечательное изобретение для 
    // работы с многострочным текстом.

  new File(subdir, 'Main.java').write(
  """package com.michaelbelyakov1967.projects.${args[0]}.$it;
 
     public class Main{

   }"""
  )

  new File(subdir, 'build.xml').write(

    // Так же поступаем и с build.xml, но поскольку в нем много двойных кавычек - 
    // используем для формирования многострочного текста тройные одинарные,
    // а в конце делаем replace.

'''<?xml version="1.0"?>
   <project name="" default="all">

   <description>HZ</description>

    // Тут еще очень много перенесенного через копипаст текста, 
    // сокращаю для повышения читаемости кода.

   <property name="package"  value="HZ_PROJECT"/>
   </project>'''.replaceAll('HZ_PROJECT', "${args[0]}")
  )
 }
}

new File(dir, ".gitignore").write(".*/**") // Пишем файл .gitignore




Может на первый взгляд это и выглядит пугающе, но поверьте мне, я эту задачу как только не пытался решать: и bash-скрипты писал, и java-утилиты. Работать-то оно работало, но и написание занимало сравнительно много времени, и что-то подправить было иногда не просто (через некоторое время забываешь, что хотел сказать в программе, не можешь разобраться в собственном коде и это нормально!). А здесь — 10 минут — и пожалуйста: и работает как надо, и кратко, и выбросить в случае чего не жалко.
  • +5
  • 14 апреля 2010, 09:24
  • yababay

Комментарии (4)

RSS свернуть / развернуть
+
0
Кратко и симпатично
avatar

Sergei_T

  • 14 апреля 2010, 10:04
+
0
Краткость сестра таланта
avatar

Engineer

  • 14 апреля 2010, 12:26
+
0
Насчет краткости вопрос спорный: эту задачу можно решить на bash меньшим количеством строк, но потребовались бы дополнительные файлы-шаблоны плюс код был бы менее читаемым. А здесь всё в одном файле и синтаксис для восприятия удобнее и интуитивно понятнее, чем в bash. По крайней мере для человека, знакомого с Java .
avatar

yababay

  • 14 апреля 2010, 12:57
+
0
На bash будет не проще
avatar

Sergei_T

  • 14 апреля 2010, 13:16

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.