Когда это нормально иметь статические и экземплярные методы все в одном классе


Это не относится конкретно к Ruby, но я в данный момент использую Ruby.
Вот класс, который обеспечивает функциональность печати текста.

class Printer

  # some static methods

  def self.fancy_print(text)
     # do fancy formatting
  end

  def self.print(text)
     fancy_print(text)
  end

  # some instance methods

  def initialize(text)
    @text = text
  end

  def print
    #somehow call fancy_print(@text)
  end
end

Это плохой дизайн, чтобы обеспечить оба экземпляра и статические методы в классе?

Иногда я хотел бы держать несколько экземпляров Printer, лежащих вокруг. В других случаях мне просто нужно сказать Printer.print(text) и просто захватить этот текст, не беспокоясь о том, чтобы сохранить его для последующего использования, что приводит к статическому методу print и экземпляру print метод.

3   3   2012-08-18 03:13:35

3 ответа:

Нет, это неплохая конструкция.

Это совершенно нормально-некоторые методы являются методами класса, некоторые-методами экземпляра. Я даже не уверен, в чем может заключаться предполагаемая проблема. Довольно трудно даже найти классы с только одним или другим, хотя в Java вы часто видите статические служебные классы.

Edit IMO вопрос вводит в заблуждение; на самом деле вы спрашиваете, плохо ли иметь статические и экземплярные методы одного и того же имя .

Это сложно, если оба являются публичными, потому что не обязательно очевидно, какИспользовать класс. Другими словами, предназначен ли он для использования с помощью статического метода или метода экземпляра? И то, и другое? Что в них особенного? Должна ли быть эта разница?.. различается по имени?

В конечном счете это зависит от контекста и использования–нет единого ответа.

Это нормально, я думаю. Вот как вы будете кодировать принтер#print method

class Printer
  def print
    self.class.fancy_print(@text)
  end
end

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

То есть, что делает fancy_print? Это что-то специфическое для класса принтера. Если это так, то вам не стоит беспокоиться.

С другой стороны, если он будет использоваться для любого строкового значения, вы можете сделать что-то более дерзкое, т. е. добавить этот метод в класс string

String.class_eval do 
  def fancy_print
    ## implementation
  end
end

Теперь вы можете сделать "Hello".fancy_print

Надеюсь, что этот ответ был из любое использование. Также пишите тестовые кейсы!