2013-08-27 11 views
6

Nauka ruby ​​i oop w ogóle, natknąłem się na metody klasowe, które, o ile rozumiem, są jak metody instancji, ale są dostępne z klasy, a nie z obiektu i mogą mieć tylko jeden działający w tym samym czasie.Jakie jest zastosowanie w klasach/statycznych metodach w ruby?

Jednak nie rozumiem, dlaczego używałbyś metody klasowej w porównaniu z normalną metodą (poza klasą), a co nawet z ich użyciem?

Na przykład:

#Why would you use: 
class Foo 
    def self.bar 
    puts "Class method" 
    end 
end 

#Versus simply: 
def bar 
    puts "Normal method" 
end 

Foo.bar # => Class method 
bar # => Normal method 

Ponieważ oboje produkują ten sam wynik? Jestem bardzo zdezorientowany, więc proszę poprawić, jeśli nie rozumiem tu/tu wszystkiego.

+0

Powinieneś przeczytać kilka podstawowych książek OOP. To pomoże lepiej zrozumieć te podstawowe pojęcia. –

+0

@maximus Czy mógłbyś polecić jakieś (lub darmowe internetowe jeszcze lepsze!)? – user2521439

+0

Aby nauczyć się podstawowej koncepcji OOP, proponuję przeczytać książkę o serialu o'reilly http://shop.oreilly.com/product/9780596008673.do i nauczyć się tego samego z ruby. Książka ruby ​​jest najlepsza http://www.sapphiresteel.com/ruby-programming/The-Book-Of-Ruby –

Odpowiedz

10

Twój przykład nie jest dobry.

Metody klasy mogą zajmować się zarządzaniem wszystkimi instancjami istniejącymi w klasie, a metody instancji radzą sobie z pojedynczą instancją naraz.

class Book 
    def self.all_by_author(author) 
    # made up database call 
    database.find_all(:books, where: { author: author }).map do |book_data| 
     new book_data # Same as: Book.new(book_data) 
    end 
    end 

    def title 
    @title 
    end 
end 


books = Book.all_by_author('Jules Vern') 
books[0].title #=> 'Journey to the Center of the Earth' 

W tym przykładzie mamy klasę o nazwie Book. Ma metodę klasy all_by_author. Pyta jakąś udawaną bazę danych i zwraca tablicę instancji Book. Metoda instancji title pobiera tytuł pojedynczej instancji Book.

Metoda klasy zarządzająca zbiorem instancji i metoda instancji zarządzają tylko tą instancją.


W ogóle, jeśli metoda będzie działać na grupy instancji, czy jest kod związany z tej klasy, ale nie bezpośrednio odczytać lub zaktualizować pojedynczą instancję, to prawdopodobnie powinna być metoda klasy.

3

Tak jak pan powiedział, są to:

  • „dostępne z klasy zamiast z obiektu i”
  • „może mieć tylko jeden działa w tym samym czasie.”

pamiętać też, że klasa jest przenośny

+1

Czy jest to raczej sprawa organizacyjna, a nie inna funkcjonalność? – user2521439

+0

To jest pomiędzy normalną metodą a metodą klasową – user2521439

+0

@ user2521439 yes, just organization –

0

Najważniejszą rzeczą jest to, że zachowuje swój kod zorganizowane. Kiedy masz setki tysięcy linii kodu, posiadanie wszystkich przypadkowo rzucających rzeczy w tę samą przestrzeń nazw może stać się koszmarem. Organizacja jest naprawdę ważna, a przestrzenie nazw są łatwym sposobem na uzyskanie modułowości dzięki wsparciu ze strony tego języka.

Nieco ważniejsze, metody klasy/modułu mogą współdzielić stan bez przecieków w różnych miejscach (np. Klasy mogą mieć zmienne instancji), a także mogą mieć prywatne metody wsparcia umożliwiające lepsze faktoring, podczas gdy metody globalne nie mogą skutecznie stać się prywatnym.

0

Masz wiele nieporozumień,

W rubin, możemy zdefiniować klasy i metody instancji.

Metoda klas służy do zapewnienia przetwarzania na poziomie klasy, tj. Danych, które mogą być dostępne tylko na poziomie klasy lub w odniesieniu do wszystkich obiektów. Na przykład, aby policzyć liczbę obiektów należących do klasy, potrzebujesz metody klasy. Jak

Foo.count 

w taki sam sposób, aby przetwarzać pojedynczy obiekt trzeba metody obiektu do przetwarzania pojedynczego obiektu jak,

obj.save 

Więc metoda klasy jest przykładem singletone wzorca projektowego, gdzie obiekt może mieć tam właścicielem wdrożenie tej samej metody.

+0

..... * jak wóod * –

+0

w ruby ​​można dynamicznie dodawać/modyfikować metodę w obiekcie. Podobnie jak w obj.define_singleton_method (: new_method) do "wykonaj pewne czynności" koniec –

+0

Modyfikowanie istniejącej metody z obiektu można wykonać poprzez proste przypisanie, takie jak tutaj http://stackoverflow.com/questions/9786495/dynamically-replace-method- implementacja-na-obiekt-w-ruby –

3

To jest bardziej pytanie OOP niż rubinowy. Metody klas w ruby ​​są używane tak samo, jak w innych językach programowania OO. Oznacza to

  • metody klasy są prowadzone w ramach klas (i mieć dostęp tylko do zmiennych klasa)
  • metody wystąpienia są uruchamiane w kontekście przedmiotu (i mieć dostęp do obiektu lub zmiennych np)

Oto lepszy przykład:

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

    def baz 
    puts 'instance method' 
    end 
end 

Foo.bar # => "class method" 
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class 

Foo.new.baz # => instance method 
Foo.new.bar # => NoMethodError: undefined method ‘bar 

Tutaj można zobaczyć, że metoda klasy jest dostępne za pośrednictwem klasy, podczas gdy metoda instancji jest dostępne za pośrednictwem instancja lub obiekt klasy (Foo.new).

Przykład został skopiowany z here, gdzie można również znaleźć więcej informacji na ten temat.

Należy pamiętać: chociaż każdy kod można umieścić w klasie lub metodzie instancji, każdy ma własne przypadki użycia i własne plusy i minusy. W OOP dążymy do wielokrotnego użytku, elastycznego i czytelnego kodu, co oznacza, że ​​zazwyczaj chcemy umieścić większość kodu jako strukturę w postaci metod instancji w sensownym modelu domeny.