2012-01-17 10 views
12

Ho cercato di prendere l'abitudine di recente di usare la parola final ovunque logica, come tutte le classi che non dovrebbe mai essere estesi.Ci sono dei benefici quando si usa la finale in AS3?

ho fatto questo semplicemente perché mi piace mantenere una rigorosa e concisa stile di codifica.

Oltre agli ovvi vantaggi in casi come lo sviluppo di fondazioni di applicazioni/giochi per altre parti o quando si lavora con altri, c'è un vantaggio reale quando si utilizza final? cioè prestazioni.

risposta

11

In base a this extensive test, la parola chiave final non fa la minima differenza in termini di prestazioni.

Il modo in cui lo standard final viene utilizzato in ActionScript, non sorprende: la parola chiave final contrassegna solo le classi e i metodi di classe e pertanto influisce solo sull'ereditarietà. Non vedo ragioni logiche perché chiamare un metodo finale debba essere più veloce di qualsiasi altro metodo: il runtime deve comunque cercare un puntatore a funzione ed eseguire la chiamata.
Lo stesso vale per methods and classes in Java. Tuttavia, in Java, final anche marks references as immutable. E questo è un grande vantaggio rispetto al suo uso in ActionScript, perché permette al compilatore di "inline" i valori (cioè sostituire tutti i riferimenti alla variabile in byte code con il suo valore reale, eliminando le procedure di ricerca), che - tra gli altri vantaggi - può velocizzare un po 'le prestazioni. Forse vedremo qualche uso di questo in una versione futura di ActionScript: sarebbe una buona idea anche per una migliore chiarezza del codice e prevenzione degli effetti collaterali.

E per queste ragioni, vorrei ancora considerarlo buona pratica utilizzare final, anche quando non si lavora con altri programmatori, nei casi in in cui il comportamento previsto richiede metodi o classi per non consentire le sostituzioni: Chiarisce intento e previene effetti indesiderati. Pertanto, accelererà lo sviluppo, e non è poi così male;)

+0

Sono d'accordo con il tuo punto finale, la gente non sembra mai prendere in considerazione il significato di uno sviluppo rapido e indolore e semplicemente il codice di slop dappertutto senza rimetterlo in ordine. – Marty

+0

Sì.Se non fosse per orgoglio artigiano (come direbbe lo zio Bob Martin), mantenere il proprio codice pulito e leggibile dovrebbe essere fatto semplicemente per ragioni pragmatiche - altrimenti si investe sempre dieci volte tanto se si deve tornare più tardi. – weltraumpirat

+0

In AS3 "contrassegna le variabili come immutabili" le chiamate costanti, non var. cioè public const myPi: Number = 1.14; Finale per classi e funzioni rende il codice più veloce a volte, soprattutto durante la compilazione per dispositivo mobile. – LeManu

1

Per evitare una classe di essere estesa o un metodo venga sacrificata, abbiamo precedere quella classe o un metodo di definizione con l'attributo finale.

Come funziona?
Per finale una classe:

final public class A 
{ 
    // 
} 

Per finale un metodo:

public class A  
{ 
    final public function A 
    { 
     // 
    } 
} 

L'attributo finale viene utilizzato per due motivi ActionScript:

In alcune situazioni, il metodo finale eseguire più veloce dei metodi non definitivi. Se stai cercando di migliorare le prestazioni della tua applicazione in ogni modo possibile, prova a rendere definitivo il suo metodo.

metodi che sono di aiuto finale nascondono dettaglio interno di una classe. Rendere finalizzata una classe o un metodo impedisce ad altri programmatori di estendere la classe o sovrascrivere il metodo allo scopo di esaminare la struttura interna della classe. Tale prevenzione è considerata uno dei modi per salvaguardare un'applicazione da uno sfruttamento malizioso.

+1

Questo in realtà non rispondere alla mia domanda, semplicemente mi dice quello che già so .. – Marty

+0

e se si cita testualmente annuncio, si prega di aggiungere la fonte: http://www.designswan.com/archives/as3- when-and-why-use-final-attribute.html – Creynders

+0

Heheh ... a quanto pare il sito cita anche senza citare le sue fonti. L'originale proviene da Essential ActionScript 3.0 di O'Reilly – Creynders

2

Non ho visto prove, né su google né sull'esperienza, che le classi oi metodi final siano più veloci di quelli non finali e, anche se lo facessero, la differenza sarebbe trascurabile.

L'unico uso vedo perché è di sigillare classi e fermare sostituzioni.

+0

Evviva, finalmente siamo d'accordo su un tema di prestazioni senza nemmeno avere una discussione! :) – weltraumpirat

0

Final viene usato raramente e con ragione. Tuttavia a volte è consigliato l'uso. Come detto dagli altri, può impedire di estendere una classe e/o sovrascrivere un metodo. Ecco una serie di risposte sull'uso di final, ma tutti si concentrano sugli aspetti di sicurezza: How could not using "final" be a security issue?

Nella mia esperienza i casi realmente utile solo di utilizzare final sono quando si crea un lib pubblico e specificamente desidera impedire l'annullamento di metodi specifici e/o l'estensione delle classi. Questo non ha nulla a che fare con la sicurezza, ma con l'incapsulamento del comportamento. È un po 'difficile pensare ad esempi reali, ma il più semplice sarebbe con i singleton, ad esempio. Se hai creato una classe a cui è richiesto l'accesso come singleton, non ha senso (so che le persone lo fanno, ma in realtà non dovrebbero) per consentire a un utente della tua classe di essere in grado di estendere quella classe. E inoltre, li condurrà in un mondo di dolore. Contrassegnare la classe come final è decisamente appropriato in questo caso.

--edit

disclaimer: Mi piacerebbe davvero voglia di scoraggiare l'uso del pattern Singleton per vari motivi:

  1. nega il polimorfismo

  2. esso non consente eredità

  3. viola SRP

Ma dal momento che si tratta di un modello così popolare, tanto vale cercare di incoraggiare le persone a fare un po 'più sicuro utilizzando la parola chiave final

4

Importante aggiornamento di un anno dopo che questo è stato chiesto -

ActionScript Compiler 2.0 ha aggiunto il supporto per l'inlining delle funzioni in determinate condizioni, una delle quali è che la funzione è static o final. Vedere: http://www.bytearray.org/?p=4789

Si noti inoltre che se avete intenzione di usare inline, è necessario decorare le vostre funzioni con il tag [inline] metadati, e utilizzare l'argomento -inline compilatore.

Problemi correlati