Когда я должен записать Статические методы?

Если я понял ваш вопрос / цель, следующее даст результаты, которые вы ищете. Он использует пакет plyr поверх пакета dplyr. Скорее всего, вы столкнетесь с проблемами при использовании функции%>% с do.call, поскольку%>% - это просто ярлык для передачи предыдущего объекта в качестве первого аргумента последующей функции, а do.call ожидает именованную функцию в качестве первого аргумента

library(plyr)

df <- data.frame(group = rep(1:4, each = 10), 
                 x1 = rnorm(40),  x2 = rnorm(40), x3 = rnorm(40), x4 = rnorm(40), 
                 X5 = rnorm(40), x6 = rnorm(40), x7 = rnorm(40))

ddply(df,.(group),function(x) 
  { 
    sapply(x[,4:ncol(x)],function(y) sd(y)/mean(y))
  })

дает следующие результаты

 group        x3        x4        X5         x6        x7
1     1  1.650401 -1.591829  1.509770   6.464991  3.520367
2     2 11.491301 -2.326737 -1.725810 -11.712510  2.293093
3     3 -3.623159 -1.416755  2.958689   1.629667 -4.318230
4     4  9.169641 -4.219095  2.083300   1.985500 -1.678107
15
задан Chris Smith 14 October 2008 в 19:56
поделиться

7 ответов

Это дает лучшее представление о намерении при использовании статической фабрики - это также позволяет Вам иметь различные фабрики, которые берут те же типы аргумента, но имеют другое значение. Например, вообразите, сделал ли Битовый массив, чтобы LoadFromResource (представил в виде строки) - не было бы возможно иметь двух конструкторов, что оба взяли строку.

РЕДАКТИРОВАНИЕ : От stevemegson в комментариях

А статическая фабрика может также возвратить пустой указатель и может более легко возвратить экземпляр, который это получило от кэша. Многие мои классы имеют статический FromId (интервал) для получения экземпляра от первичного ключа, возвращая существующий кэшируемый экземпляр, если у нас есть тот.

16
ответ дан 30 November 2019 в 23:59
поделиться

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

, Чем менее нелокальное состояние, от которого зависит метод, тем легче понять, таким образом static полезный сигнал читателю кода.

9
ответ дан 30 November 2019 в 23:59
поделиться

Статические методы обычно полезны для операций, которые не требуют никаких данных из экземпляра класса (от this) и могут выполнить их намеченную цель только с помощью их аргументов.
А простым примером этого был бы метод Point::distance(Point a, Point b);, который вычисляет расстояние между двумя точками, и не требуйте экземпляра.

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

28
ответ дан 30 November 2019 в 23:59
поделиться

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

В случае LoadFromFile (), Вы хотите статический метод, потому что Вы хотите нулевую ссылку, если загрузка перестала работать - экземпляр еще не существует. При реализации его как конструктор необходимо было бы выдать Исключение при отказе.

Другое хорошее использование для помех: Сравните (obj a, obj b), Удалите (obj a) для объектов данных (объект не может удалить себя, так как его ссылка все еще вокруг), или статические Классы для процессуального кодекса, который честно не может быть смоделирован в объекте.

7
ответ дан 30 November 2019 в 23:59
поделиться

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

Поэтому, если Вы не можете создать экземпляр, как Вы получаете доступ к методам экземпляра класса? Путем вызова статического метода, который возвращает экземпляр Singleton класса.

Это - конечно, всего один сценарий, но существуют многие другие.

0
ответ дан 30 November 2019 в 23:59
поделиться

Вот некоторые примеры того, когда Вы могли бы хотеть использовать статические методы:

1), Когда функция не использует членских переменных. Вы не должны использовать статический метод здесь, но обычно помогает, делаете ли Вы.

2) При использовании методов фабрики создать объекты. Они особенно необходимы, если Вы не знаете, что тип создается заранее: например,

class AbstractClass {
    static createObject(int i) {
        if (i==1) {
           return new ConcreteClass1();
        } else if (i==2) {
           return new ConcreteClass2();
        }
     }
}

3), Когда Вы управляете или иначе отслеживаете, количество инстанцирований класса. Singleton является наиболее используемым примером этого.

4) При объявлении констант.

5) Операции, такие как виды или сравнения, которые воздействуют на несколько объектов класса и не связываются ни с каким конкретным экземпляром.

6), Когда специальная обработка должна быть сделана перед первым инстанцированием объекта.

1
ответ дан 30 November 2019 в 23:59
поделиться

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

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

class Foo
{
    public Foo(){}
    public static void bar(){}  // valid with or without 'static'
    public void nonStatic(){ bar(); }
}

...
Foo a = new Foo();
a.bar();

, Таким образом, необходимо добавить 'статичный' к любым методам, Вы можете.

2
ответ дан 30 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

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