2013-08-27 13 views
6

Imparando Ruby e Oop in generale, mi sono imbattuto in metodi di classe che, per quanto ho capito, sono come metodi di istanza, ma sono accessibili dalla classe piuttosto che da un oggetto e possono avere solo uno in esecuzione contemporaneamente.Qual è l'uso in classe/metodi statici in ruby?

Tuttavia, non capisco perché si dovrebbe utilizzare un metodo di classe rispetto a un metodo normale (al di fuori di una classe) e quale è anche il loro uso?

Ad esempio:

#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 

Mentre entrambi producono lo stesso risultato? Sono abbastanza confuso su di loro quindi per favore correggi se sto fraintendendo/tutto qui.

+0

Si dovrebbe leggere un libro OOP di base. Ciò aiuterà di più a capire questi concetti di base. –

+0

@maximus Potresti raccomandarne uno (o quelli online gratuiti ancora meglio!)? – user2521439

+0

Per imparare il concetto OOP di base, ti suggerisco di leggere il libro della serie o'reilly http://shop.oreilly.com/product/9780596008673.do e di imparare lo stesso con ruby. Il libro di ruby ​​è il migliore http://www.sapphiresteel.com/ruby-programming/The-Book-Of-Ruby –

risposta

10

Il tuo esempio non è buono.

I metodi di classe possono occuparsi della gestione di tutte le istanze esistenti di una classe e i metodi di istanza gestiscono una singola istanza alla volta.

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' 

In questo esempio abbiamo una classe denominata Book. Ha un metodo di classe all_by_author. Interroga alcuni database fittizi e restituisce un array di istanze Book. Il metodo di istanza title recupera il titolo di una singola istanza Book.

Quindi il metodo di classe che gestisce una raccolta di istanze e il metodo di istanza gestisce solo quell'istanza.


In generale, se un metodo potrebbe operare su un gruppo di istanze, o è codice relativo a tale classe ma non legge direttamente o aggiornare una singola istanza, allora probabilmente dovrebbe essere un metodo di classe.

3

Proprio come hai detto tu, sono:

  • "si accede dalla classe, piuttosto che da un oggetto e"
  • "può avere solo una esecuzione allo stesso tempo."

ricordare, anche, che la classe è portatile

+1

Quindi è più una cosa organizzativa piuttosto che una diversa funzionalità – user2521439

+0

Questo è tra un metodo normale e un metodo di classe – user2521439

+0

@ user2521439 sì, solo l'organizzazione –

0

La cosa più importante è che mantiene il proprio codice organizzato. Quando hai centinaia di migliaia di righe di codice, averle tutte a casaccio nello stesso spazio dei nomi può diventare un incubo. L'organizzazione è molto importante e gli spazi dei nomi sono un modo semplice per ottenere la modularità con il supporto della lingua.

In modo un po 'meno importante, i metodi di classe/modulo possono condividere lo stato senza lasciarlo dappertutto (ad esempio le classi possono avere variabili di istanza) e possono avere metodi di supporto privati ​​per consentire un factoring migliore, mentre i metodi globali non possono efficacemente reso privato.

0

Hai un sacco di malintesi,

In ruby, possiamo definire di classe e metodo di istanza.

Il metodo di classe viene utilizzato per fornire elaborazione a livello di classe, ovvero dati che possono essere disponibili solo a livello di classe o relativi a tutti gli oggetti. Ad esempio, per contare il numero di oggetti che appartengono alla classe è necessario il metodo di classe. Come

Foo.count 

In stesso modo, per elaborare singolo oggetto è necessario il metodo oggetto per elaborare un singolo oggetto come,

obj.save 

Quindi, metodo di classe è esempio di design pattern Singletone cui oggetto può avere lì proprio implementazione dello stesso metodo.

+0

..... * come funziona * –

+0

in ruby ​​è possibile aggiungere/modificare il metodo in oggetto dinamicamente. Come in obj.define_singleton_method (: new_method) do "fai alcune cose" fine –

+0

La modifica del metodo esistente dall'oggetto può essere eseguita con un semplice compito come qui http://stackoverflow.com/questions/9786495/dynamically-replace-method- attuazione contro un oggetto in rubino –

3

Questa è più una domanda OOP che una rubino. I metodi di classe in rubino vengono utilizzati come in altri linguaggi di programmazione OO. Ciò significa:

  • metodi di classe vengono eseguiti nel contesto di una classe (e avere accesso solo alle variabili di classe)
  • metodi di istanza vengono eseguite nel contesto di un oggetto (e avere accesso alle variabili di istanza oggetto del o)

Ecco un esempio migliore:

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 

Qui si può vedere che metodo di classe si accede attraverso una classe, mentre il metodo di istanza si accede tramite un'istanza o oggetto di una classe (Foo.new).

L'esempio viene copiato da here, dove è anche possibile trovare ulteriori informazioni su questo argomento.

Ricordare: sebbene qualsiasi codice possa essere inserito in una classe o in un metodo di istanza, ognuno ha i propri casi d'uso e propri pro e contras. In OOP ci impegniamo per un codice riutilizzabile, flessibile e leggibile, il che significa che di solito vogliamo mettere la maggior parte del codice strutturato come i metodi di istanza in un modello di dominio ragionevole.

Problemi correlati