Как я могу рефакторинг кода, который вызывает несколько методов для одного и того же объекта? - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть такой код:

 context = area.window.create_cairo_context

 context.set_source_rgb(0, 0, 0)
 context.set_line_width(0.5)
 context.arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees)
 context.arc(x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees)
 context.arc(x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees)
 context.arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
 context.close_path
 context.stroke_preserve
 context.set_source_rgb(0.7, 1.0, 1.0)
 context.fill

Обратите внимание, что я вызываю методы для одного и того же объекта снова и снова.Возможно ли, что Ruby позволит мне изменить текущий объект (self) на контекст, чтобы я мог просто продолжать вызывать эти методы без явного получателя, пока я не изменю область действия?какой-то способ не вводить контекст снова и снова!

Ответы [ 2 ]

3 голосов
/ 01 апреля 2011

Используйте instance_exec или instance_eval

area.window.create_cairo_context.instance_exec do
  set_source_rgb(0, 0, 0)
  set_line_width(0.5)
  arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees)
  arc(x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees)
  arc(x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees)
  arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
  close_path
  stroke_preserve
  set_source_rgb(0.7, 1.0, 1.0)
  fill
end

Просто чтобы заметить: вы можете опустить скобки вокруг аргументов. Это больше напоминает настройку конфигурации, чем написание кода. Люди из Ruby on Rails, к которым я не принадлежу, похоже, предпочитают этот способ.

area.window.create_cairo_context.instance_exec do
  set_source_rgb  0,   0,   0
  set_line_width  0.5
  arc           x+width-radius, y+radius,        radius, -90*degrees, 0*degrees
  arc           x+width-radius, y+height-radius, radius, 0*degrees,   90*degrees
  arc           x+radius,       y+height-radius, radius, 90*degrees,  180*degrees
  arc           x+radius,       y+radius,        radius, 180*degrees, 270*degrees
  close_path
  stroke_preserve
  set_source_rgb  0.7, 1.0, 1.0
  fill
end
3 голосов
/ 01 апреля 2011

Почему бы вам не реализовать цепочку методов ?Возвратите себя из каждого вызова метода, чтобы вы могли сделать что-то вроде:

context.set_source_rgb(0, 0, 0)
       .set_line_width(0.5)
       .arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
       .close_path.fill
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...