utilizzando metodi e classi statici

4

So che i metodi / variabili statici sono associati alla classe e non agli oggetti della classe e sono utili in situazioni in cui è necessario tenere il conto, ad esempio il numero di oggetti della classe che sono stati creati. I membri non statici, d'altra parte, potrebbero aver bisogno di lavorare sull'oggetto specifico (ad esempio, per utilizzare le variabili inizializzate dal costruttore)

La mia domanda che cosa dovremmo fare quando non abbiamo bisogno di nessuna delle funzionalità?

Dire che ho solo bisogno di una funzione di utilità che accetti valori (s) e restituisce un valore basato esclusivamente sui valori passati. Voglio sapere se tali metodi dovrebbero essere statici o meno. Come viene influenzata l'efficienza della programmazione e quale è una pratica / convenzione di codifica migliore e perché.

PS: non voglio scatenare un dibattito, voglio solo una risposta soggettiva e / o riferimenti.

    
posta vedant 04.07.2012 - 11:04
fonte

4 risposte

4

I metodi che non sono associati a una classe specifica come questi sono chiamati "funzioni libere" e, come hai adeguatamente notato, OO non provvede a loro, e alcune lingue non forniscono loro le stesse possibilità.

In una lingua come C ++ puoi semplicemente inserire la funzione in un namespace. Ma se stai lavorando in Java o C # devi metterli in una classe senza senso e renderli membri statici senza una buona ragione.

    
risposta data 04.07.2012 - 11:12
fonte
3

È abbastanza normale in Java rendere tali metodi statici e metterli in "classi" con altri metodi statici. Certamente non vorrai rendere i metodi non-statici, confonderai tutti, inclusi gli ottimizzatori. Suppongo che i progettisti avrebbero potuto pensare a un nome oltre a "class" ("namespace"?) Per contenere questi metodi / funzioni, ma la maggior parte di noi ha abbastanza da ricordare come è. Devo ammettere che dover aggiungere un costruttore privato a una classe "statica" sembra un po 'sciocco, ma il lavoro viene svolto senza aggiungere nuove regole.

C # è un po 'più esplicito, con una classe statica (senza virgolette attorno a statico ), non c'è bisogno di un costruttore privato e l'applicazione della regola dei soli metodi statici.

(Java ha una "classe statica", ma è qualcosa completamente diverso, principalmente inteso, senza dubbio, per confondere discussioni come questa.)

    
risposta data 05.07.2012 - 16:30
fonte
1

Se tali funzioni di utilità sono relativamente piccole e non simili ad altre, è possibile utilizzare le funzioni statiche. Inoltre, la cosa più importante, non dovrebbero essere correlati all'astrazione dell'oggetto (la classe) e inoltre non dovresti abusarne; non rappresentano un modo di programmazione OOPish.

Ho parlato delle dimensioni, perché se sono grandi allora dovresti usare gli oggetti per ottenere una coesione migliore (condividi alcuni dati tra le funzioni per variabili d'istanza). Ho parlato di funzioni simili perché potresti voler usare il potere del polimorfismo.

Per quanto riguarda i metodi statici di efficienza potrebbe essere un po 'più veloce, ma da questo non otterresti un notevole aumento di prestazioni.

    
risposta data 04.07.2012 - 11:17
fonte
1

Continuando con l'esempio di System.Math in C #, alcune lingue come Nemerle ti consentono di aggiungere un'istruzione using che consente effettivamente di usi un comportamento di classi come funzioni libere, così come l'accesso diretto alle sue costanti & altri membri statici.

using System.Math // using statement at class level

public class Example
{
    public TestMethod() : void
    {
        def radians = Pi; // direct access to Math.Pi

        def x = Sin(radians); // direct access to Math.Sin & Math.Cos
        def y = Cos(radians);
    }
}

In sostanza questo ti permette di trattare una classe come uno spazio dei nomi, che come sottolineato da DeadMG è fondamentalmente ciò che System.Math è ...

    
risposta data 05.07.2012 - 17:44
fonte

Leggi altre domande sui tag