Perché Zend scoraggia le "funzioni fluttuanti"?

6

Zend's Convenzione di denominazione standard di codifica dice

Functions in the global scope (a.k.a "floating functions") are permitted but discouraged in most cases. Consider wrapping these functions in a static class.

La saggezza comune in Python dice praticamente l'opposto :

Finally, use staticmethod sparingly! There are very few situations where static-methods are necessary in Python, and I've seen them used many times where a separate "top-level" function would have been clearer.

(Non solo la risposta StackOverflow di cui sopra avvisa contro l'uso eccessivo di metodi statici, ma più di un lintero di Python avvertirà lo stesso.)

È qualcosa che può essere generalizzato attraverso i linguaggi di programmazione, e se è così, perché Python differisce così da PHP? Se non è qualcosa che può essere generalizzato, qual è la base per un approccio o l'altro, e c'è un modo per riconoscere immediatamente in una lingua se preferisci le funzioni bare oi metodi statici?

    
posta kojiro 18.12.2012 - 19:48
fonte

3 risposte

7

la differenza fondamentale tra le funzioni globali di php e la loro controparte python è nel loro ambito:

Le funzioni di livello superiore di Python fanno parte del modulo in cui sono definite. quando vengono importati, vengono chiamati con defining_module.function_name() quindi c'è meno rischio di nomi in conflitto.

Le funzioni

php "globali" sono in realtà globali , iirc, a prescindere da dove vengono chiamate. quindi sono molto più propensi a creare problemi di denominazione, ad es. essere sovrascritto da alcune librerie di terze parti, ecc.

    
risposta data 18.12.2012 - 20:15
fonte
4

In generale, è una cosa preferenziale. "Statico" in questo contesto è solo un'altra parola per "globale", quindi anche se in entrambi i casi otterrete alcuni sguardi cattivi (in particolare se utilizzate solo classi come spazi dei nomi), funzionerà.

Ma:

  • PHP può essere facilmente impostato su classi di caricamento automatico, in modo che le funzioni statiche non vengano caricate finché non ne hai bisogno (o altre nella stessa classe). Tuttavia, non può fare lo stesso per le singole funzioni (ancora). Non sono sicuro che Python abbia un equivalente per entrambi, ma non l'ho ancora visto.

  • A differenza delle funzioni globali, le funzioni dei membri statici possono generalmente essere rese private, quindi è più facile esporre solo i bit che intendi utilizzare per gli estranei. Bene, tranne in Python, dove devi saltare attraverso alcuni cerchi per ottenere membri privati.

  • PHP non supportava lo spazio dei nomi fino a poco fa, il che significa che ogni funzione di primo livello era stipata nello stesso spazio dei nomi. Questo è cambiato, ma gli spazi dei nomi PHP sono ancora piuttosto orribili. : P

  • Sembra che Python non come renda statiche le funzioni membro. Altre lingue hanno una parola chiave per questo scopo; in Python, a quanto pare hai bisogno di un'annotazione (scusami, "decoratore").

risposta data 18.12.2012 - 20:14
fonte
2

Lo spazio dei nomi Python è tutto: Tutto è in un modulo, e tutto ciò che è definito in un modulo ha l'ambito del modulo piuttosto che l'ambito globale (devi fare del male e fare cose cattive per aggiungere qualcosa a "tutti" ambiti). Quindi il nome delle collisioni non è un problema. In PHP, d'altra parte, se vai avanti e definisci una funzione, la metti nello stesso ambito che tutti usano per i nomi globali. O usi esplicitamente un namespace per impedirlo, oppure usi una classe come "spazio dei nomi" (anche se la classe dovrebbe probabilmente trovarsi in una namespace stessa). Il vantaggio aggiunto è che le classi beneficiano dei caricatori automatici, mentre le funzioni non sono IIRC.

Ci sono anche differenze filosofiche. La comunità Python è (e molto è stata) molto aperta all'utilizzo di più paradigmi. Le classi, le funzioni di ordine superiore e la semplice programmazione procedurale sono tutti metodi accettati allo stesso modo, a patto che si adattino al problema. E le funzioni + dati a livello di modulo fanno esattamente ciò, quindi, a meno che non sia necessario il polimorfismo o si desideri un'associazione strong con una particolare classe, c'è un piccolo vantaggio nel collegare un non-metodo a una classe. Al contrario, la comunità PHP (almeno da quando la maggioranza ha smesso di fregare e ha dato a PHP la cattiva reputazione che ha accumulato nel corso degli anni) sembra essere focalizzata pesantemente sulla programmazione orientata agli oggetti. Le funzioni libere semplicemente non rientrano in questo paradigma, mentre static è ampiamente accettato. Non ho proprio capito la logica, ma tale è la convenzione.

Infine, nota che staticmethod non è solo evitato perché non ci piace il concetto di metodi statici. A volte vogliamo metodi statici, ma di solito preferiamo classmethod , che fondamentalmente fa la stessa cosa ma dà più potere al metodo (riceve l'oggetto classe, e quindi può esserci polimorfismo tra classmethod s). staticmethod è talvolta considerato completamente ridondante.

    
risposta data 18.12.2012 - 20:38
fonte

Leggi altre domande sui tag