Как Вы предпочитаете определять методы класса в Ruby?

PHP 7 значительно упрощает создание абстрактных «свойств». Как и выше, вы создадите их, создав абстрактные функции, но с помощью PHP 7 вы можете определить тип возвращаемого значения для этой функции, что значительно упрощает создание базового класса, который может расширять каждый.

<?php

abstract class FooBase {

  abstract public function FooProp(): string;
  abstract public function BarProp(): BarClass;

  public function foo() {
    return $this->FooProp();
  }

  public function bar() {
    return $this->BarProp()->name();
  }

}

class BarClass {

  public function name() {
    return 'Bar!';
  }

}

class FooClass extends FooBase {

  public function FooProp(): string {
    return 'Foo!';
  }

  public function BarProp(): BarClass {
    // This would not work:
    // return 'not working';
    // But this will!
    return new BarClass();
  }

}

$test = new FooClass();
echo $test->foo() . PHP_EOL;
echo $test->bar() . PHP_EOL;
9
задан Mike Woodhouse 19 May 2009 в 09:35
поделиться

6 ответов

Я постоянно использую способ 1:

class Foo
  def self.bar
    puts 'class method'
  end
end

Он не является подробным и сохраняет метод в том же контексте класса.

12
ответ дан 4 December 2019 в 12:20
поделиться

Я предпочитаю способ 1, поскольку он не зависит от контекста. Я не люблю прыгать в середину файла, а затем прокручивать вверх или вниз, чтобы увидеть, означает ли отступ, что я нахожусь в блоке class << self , или это просто вложенный модуль.

1
ответ дан 4 December 2019 в 12:20
поделиться

Я использую способ №3, но я думаю, что способ №1 тоже хорош. Это зависит от вашего использования. Если вы хотите, чтобы ваш код можно было «вырезать / вставить» в другие модули и классы, то лучше вариант №1. Я использую Способ №3, чтобы сделать вырезание / вставку кода более болезненным, b / c мантра Ruby - «не повторяйся», поэтому не следует вырезать / вставлять код очень часто ..

0
ответ дан 4 December 2019 в 12:20
поделиться

Согласен с большинством пользователей. Я обычно использую в первую очередь

# Way 1
class Foo
  def self.bar
    puts 'class method'
  end
end

. Если я правильно помню, есть некоторые небольшие отличия, которые показаны на переговорах по метапрограммированию прагматичных программистов (которые я рекомендую), которые связаны с тем, как вызывается и выполняется код класса.

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

1
ответ дан 4 December 2019 в 12:20
поделиться

Я считаю << добавление метода слишком необычным (хотя я с удовольствием использую << со строками и вводом-выводом).

Я избегаю Foo.bar, потому что это означает повторение самого себя.

0
ответ дан 4 December 2019 в 12:20
поделиться

Обычно я предпочитаю def self.foo для отдельных методов и class << self для длинных отрезков методов класса. Я чувствую, что это делает различие между частью метода класса и частью метода экземпляра в определении класса.

3
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: