2012-03-06 7 views
7

In Chapter 2: Meaningful Names zio Bob scrive:Objective-C convenzione di denominazione di classe contro lo zio Bob

Non Aggiungere Contesto Gratuitous

In un'applicazione immaginaria denominata "Gas Stazione Deluxe," è un male idea di prefisso ogni classe con GDS. Francamente, stai lavorando contro i tuoi strumenti. Si digita G e la chiave di completamento stampa e sono ricompensati con una lista miglio-lunga di ogni classe nel sistema

In realtà che cosa ho scoperto durante i miei primi giorni con Objective-C un po 'più di un anno fa. Dopo Java è stato piuttosto deludente, ma ho pensato di essere solo uno che ne era infastidito :) Capisco che il libro "Codice pulito" si riferisce a Java il più delle volte e Java ha namespace (pacchetti) a differenza di Objective-C.

Utilizzi un prefisso di 2-3 lettere nelle classi se stai creando un'app, non una libreria? Cosa ne pensi, è un cattivo linguaggio design, lingua "funzionalità" o Zio Bob non era proprio qui?

+1

Potresti essere interessato a leggere [il saggio di Mike Ash sulle costanti e le funzioni con spazi dei nomi in ObjC] (http://www.mikeash.com/pyblog/friday-qa-2011-08-19-namespaced-constants-and- functions.html). –

risposta

13

Forse la parola chiave qui è gratuita. In Objective-C, i prefissi servono allo scopo importante di ridurre la possibilità di conflitti di nome. In altri linguaggi come Java e C++, l'esistenza del supporto per gli spazi dei nomi rende l'uso di prefissi gratuiti (e una violazione del principio SECCO spesso citato). In Objective-C, tuttavia, i prefissi sono significativi, utili e non gratuiti.

+0

Grazie. Comprendo PERCHÉ i prefissi delle classi sono inclusi nelle convenzioni sulla codifica della lingua. Comunque penso che i namespace siano una soluzione molto migliore ed è un po 'strano che il linguaggio abbastanza moderno non li abbia. – OgreSwamp

+2

@OgreSwamp Due cose da ricordare su Objective-C sono che è vecchio come C++ (sia apparso nel 1983) e che in molti casi si rifugge caratteristiche e la complessità e li sostituisce con la convenzione e lo stile. Forse gli spazi dei nomi sono così utili e sarebbero un tale miglioramento per il linguaggio che vale la pena di introdurli come funzionalità linguistica. (Io non la penso così.) Comunque, il mio scopo non era di spiegare prefissi, ma piuttosto sottolineare che la linea guida non significa che i prefissi sono cattivi, ma solo che i prefissi sono male, se non servono a uno scopo. – Caleb

0

Personalmente non uso quasi mai prefissi. Le uniche eccezioni sono le classi che sono in qualche modo connesse tra loro o che dovrebbero essere tutte presenti.

Un esempio:

Alcune app client per chat. Chiamiamo quella chat un ExampleChat.

Quindi utilizzerei ECMessage, ECUser, ECRoom, ecc. Per vedere facilmente quali classi dovrebbero esserci.

Oppure, se creo delle celle personalizzate per UITableView, utilizzerei i prefissi per tenerli tutti vicini e non fare fatica a cercarli in una "lista lunga un miglio". Esempio:

ECTextMessageCell, ECSoundMessageCell, ECUploadMessageCell, ECJoinOrLeaveMessageCell, ecc

Questa è la mia opinione personale, che non può essere il migliore. Ma è ancora più facile per me.

Speranza che aiuta

+0

Metterei tutte quelle classi in uno spazio dei nomi o sotto-namespace 'ExampleChat' dove la lingua lo consente. I prefissi sono utili solo quando gli spazi dei nomi non sono un'opzione (che è quello che stiamo discutendo.) –

+0

Sono con voi in caso di lingue come Objective-C, dove nessun pacchetto/namespace o un concetto simile a quella di strutturare la fonte. – GeT

+0

Questa è la situazione esatta descritta in Clean Code ed è menzionata come cattiva pratica. Sono abbastanza d'accordo con lo zio Bob, ma penso che sia colpa della sintassi del linguaggio (senza spazi dei nomi per le classi) – OgreSwamp

0

Beh, se non si dispone di spazi dei nomi, nomi di conflitti sono probabile che si verifichi. Puoi vedere che in molte librerie C stanno usando una sorta di prefisso. Quindi immagino ci siano dei buoni motivi per avere quei prefissi e altri motivi per non usarlo. Ma quale dovrebbe essere il grosso problema per modificare il completamento o semplicemente ignorare il prefisso di digitare tre lettere invece di una sola.

Quindi alla fine mi sembra una questione di gusti. Immagino che sarebbe più importante avere classi di buone strutture con prefissi invece di un casino di classi senza prefisso ....

Non ha nulla a che fare con il cattivo linguaggio design IMHO. C'è stato un tempo in cui il software non era ovunque e perché si dovrebbe sprecare ulteriore sforzo sui namespace? E ancora come possiamo vedere anche al giorno d'oggi si usano le lingue senza spazi dei nomi .....

+0

Objecive-C 3.0 ha circa 1 anno circa. Hanno avuto la possibilità di risolvere il problema con gli spazi dei nomi, quindi le discussioni sui vecchi tempi non funzionano qui IMHO – OgreSwamp

+0

Non ha familiarità con "Objective-C 3.0". Puoi fornire un link ad esso? –

+0

Mi dispiace, quello era l'errore di battitura, 2.0. E ho commesso un errore in un'età. È circa 5 anni fa. Ad ogni modo, non è troppo vecchio, giusto? :) – OgreSwamp

0

Direi che il mondo non è bianco o nero.Ho fare programmazione in Java, con i pacchetti e, sì, è fastidioso avere un prefisso in ogni classe, così come è fastidioso e sostenibile per iniziare interfacce con I (proprio come .Net utilizzato per farlo).

A volte mi infastidisce nell'obiettivo-c tuttavia ha una certa legittimità se non si dispone di pacchetti nella propria lingua, dal momento che è possibile "creare" gruppi artificiali di classi come "NS", "UI", "MK" e così via in objc e cacao.

+0

Ma questo è un difetto di lingua. Inoltre, è probabile che avrò una collisione di nomi con EXMessage, quindi in com.example.Message sono milioni di volte più alti. – OgreSwamp

+0

Non sono sicuro se possiamo etichettarlo solo come un difetto, ma piuttosto una caratteristica o una restrizione. è la mancanza di oggetti e spazi dei nomi di un guasto lingua in C? Preferirei dire che fa parte delle caratteristiche della lingua. E se consideriamo il linguaggio di una sorta di strumenti, che ognuno di loro ha il proprio modo di utilizzare. Alcune pratiche sono valide o addirittura preferibili in una ma assolutamente no-go in un'altra. – GeT

3

Ero tentato di chiudere questo problema, ma non credo che ho visto uno simile chiesto prima ed è una domanda valida. Ecco i miei pensieri piuttosto disordinati sull'argomento.

Molte lingue hanno una funzione denominata spazi dei nomi, in cui il nome di classe "completo" è preceduto da una serie gerarchica di nomi. Ad esempio, la classe String in Java è, propriamente, java.lang.String, e una classe personalizzata è correttamente com.whatever.foobar.MyClass.

Sfortunatamente, gli spazi dei nomi non sono mai stati aggiunti a Objective-C, il che significa che i simboli Objective-C (nomi di classi, nomi di protocollo e alcuni altri tipi diversi) non possono essere inseriti in un namespace anche quando si utilizza Objective-C++ (che ha una caratteristica dello spazio dei nomi per le funzioni, le costanti, strutture, ecc)

L'unica soluzione per evitare le collisioni di simboli in codice condiviso, quindi, è quello di utilizzare una qualche forma di nome pressare per rendere i vostri nomi simbolo unico. In Objective-C, la convenzione usa un prefisso di due caratteri (a volte il numero varia) per tutte le classi.

Costui zio Bob è un twit per raccontare di non farlo, perché mentre ci si ritroverà con un programma che non viene compilato, perderete alcun beneficio di spazi dei nomi, che viene anteposta offrono ancora. La tua app utilizza plug-in? Devi prefisso. La tua app ha un'API pubblica? Devi prefisso.

In teoria, il codice all'interno di una singola applicazione che non tocca mai il mondo esterno può fare senza prefissi, ma avvitarlo - mantenere la codifica pulita e aggiungere un prefisso anche lì. Ti risparmierà più tardi.

0

Al di là di collisioni evitando, uno dei vantaggi che i prefissi di nome dà è che sei immediatamente consapevoli di che tipo che stai veramente fare. Si supponga di avere il seguente codice:

Color c = ...; 
MultiValueMap m = ...; 

Da una rapida occhiata al codice e seconda di ciò che le biblioteche hai utilizzato, quei tipi potrebbe essere da un certo numero di fonti diverse. Potrebbe essere necessario cercare quale istruzione include/import è stata fatta per capire cosa può fare il tipo (ad es. Si desidera modificarlo ma manca un metodo che si è sicuri che ci sia).

Nel mondo iOS, si sarebbe subito sapere se si tratta di un UIColor contro un CGColor e ottenere contesto immediato.

In passato al WWDC, Apple avrebbe ospitato una sessione in cui venivano spiegate le convenzioni di codifica Cocoa/Objective-C. Credo che menzionino questo aspetto dei prefissi dei nomi, quindi potresti voler trovare una delle registrazioni rese disponibili. Altri sviluppatori C (ad es.Anche gli sviluppatori del kernel Linux non sembrano pensare molto agli spazi dei nomi C++ (tra le altre caratteristiche del C++) per vari motivi.

+0

Grazie Bryant. Ma penso che avere UIColor e CGColor nel framework standard sia un altro esempio del design "cattivo". – OgreSwamp

Problemi correlati