Domanda

Ho notato nel corso degli anni che diversi sviluppatori hanno criteri diversi per ciò che costituisce un livello nello sviluppo di un sistema di livello n, quindi ero curioso di sapere quale sia il consenso qui su StackOverflow.

I livelli logici separati sono sufficienti per chiamarlo un livello separato o deve essere distribuibile su un server separato (fisico o virtuale) per chiamarlo un livello separato?

Lasciami esprimere la domanda in modo leggermente diverso. Se il meccanismo di chiamata può essere solo in elaborazione, thread locale o appartamento locale, è possibile affermare che si tratta di due livelli diversi a seconda di come le classi sono organizzate in librerie o pacchetti?

È stato utile?

Soluzione

Per livello fisico, per me significa parte del sistema, progettato per essere eseguito su macchine fisiche diverse. Sì, puoi puntare la tua stringa di connessione db a un altro server in qualsiasi momento, ma se il DAL è troppo chiacchierone, ha n + 1 e problemi di set di record illimitati, la latenza di rete ti ucciderà molto velocemente.

Il livello logico, d'altra parte, supporta le virtù della separazione delle preoccupazioni, della coesione e dell'accoppiamento. Rigorosamente non deve nemmeno essere in un assembly separato: lo spazio dei nomi farà il trucco. Basta non chiamare le lezioni che sai che non dovresti, NDepend ti aiuta.

Altri suggerimenti

Per me è sufficiente un livello logico separato per chiamarlo livello. Non deve necessariamente trovarsi su un server separato, ma la separazione definita dagli altri livelli lo rende certamente possibile.

Ad esempio, avevamo quello che definirei un sistema a 3 livelli (pagine db, dll, asp) in esecuzione su un singolo server. Secondo alcune definizioni si tratta di un sistema a singolo livello. Ora abbiamo il database in esecuzione su un server separato, l'unica modifica richiesta era una stringa di connessione ma ora questa sarebbe una soluzione a due livelli?

Questo è il motivo per cui ritengo che il concetto di un livello riguardi più la capacità di eseguirli su macchine separate piuttosto che doverlo fare. Mi sembra più coerente.

  

I concetti di livello e livello sono   spesso usato in modo intercambiabile. Però,   un punto di vista abbastanza comune è   che c'è davvero una differenza, e   che uno strato è una strutturazione logica   meccanismo per gli elementi che compongono   la soluzione software, mentre a un livello   è un meccanismo di strutturazione fisica   per l'infrastruttura di sistema

Ref .

I livelli sono un meccanismo per ridurre al minimo l'accoppiamento; sono logici. I livelli sono progettati per massimizzare le prestazioni o negare i rischi per la sicurezza; sono fisici. Non sono proprio gli stessi e non sono sicuro del perché le persone provino a usarli in modo intercambiabile.

La maggior parte delle applicazioni Web sono di default a 3 livelli (browser, server Web, server database). La maggior parte delle app Intranet sono a 2 livelli (client, server db). Ma in entrambi i casi creo un livello UI, un livello aziendale e un livello dati. Hanno una separazione delle preoccupazioni e mi aiutano a strutturare il mio codice per la manutenibilità. Anche in entrambi i casi di solito finisco per distribuirli tutti su una scatola; server Web o workstation client. Quindi i livelli e i livelli non corrispondono nemmeno.

Ho sempre creduto che un livello fosse una separazione fisica in un'architettura, cioè una macchina. Ho scoperto che questi ragazzi la pensano allo stesso modo ultimamente, è un ottimo libro.

Ma pensando bene dopo aver letto le altre risposte, concordo con Garry su che .

Concordo con Garry Shutler, ma aggiungo che potrebbero esistere anche molti livelli in un singolo processo / thread o persino nello stesso assieme. più importante della separazione fisica (hardware, isolamento eseguibile o isolamento binario) è il layout del codice per lo sviluppatore (IMHO). come in un'app aspnet: la stessa dll potrebbe contenere tutti e tre i livelli: accesso ai dati, dominio e presentazione.

Dovrei dire che le definizioni devono essere eliminate. In genere penso a un livello come una separazione logica di funzionalità e responsabilità e un livello come requisito o capacità per una separazione fisica. Alcuni livelli possono avere più livelli e alcuni livelli possono estendersi ai livelli. In genere utilizzo un livello di servizio che ha la capacità di fornire la separazione fisica se necessario e / o desiderato tramite la configurazione.

Quindi, segui domanda / commento. Se c'è un mucchio di logica (aziendale o di altro tipo) nelle procedure memorizzate nel database, dovrebbe essere considerato anche un livello? Cosa succede se si utilizzano funzionalità del motore di database come Service Broker per Microsoft SQL Server? Questo può essere visto come avere due livelli stessi.

Inoltre, i servizi in background e / o i demoni, sono un livello e / o un livello separati o appartengono a uno esistente?

Guarda la cronologia del termine "livello" nell'informatica. Nessuno ha detto che il calcolo a 1 livello su desktop / mini / mainframe. Nessuno ha detto elaborazione a 2 livelli durante i giorni client-server. A 3 livelli è diventato il moniker architettonico per client-server più middleware in mezzo (middleware orientato ai messaggi e broker di transazioni). Penso che n-tier sia stato reso popolare insieme ad un altro termine "EAI - o Enterprise Architecture Integration". Era esattamente la stessa idea delle architetture orientate ai servizi, tranne per il fatto che la maggior parte delle implementazioni dei fornitori erano proprietarie, basate su standard ma molto costose o entrambe. Dopo che XML-RPC, SOAP e REST arrivano, lo chiamano " Servizi Web " e quindi applicare il principio EAI dietro di esso e arrivare a SOA - Service Oriented Architecture e Enterprise Service Bus.

Il mio punto è che nessuno di questi termini implicava alcuna separazione fisica ... riguardava sempre la separazione logica della funzionalità. È successo che molti di questi livelli logici di applicazione sono stati progettati per essere apolidi in modo che POTREBBE essere separati fisicamente ai fini della scalabilità orizzontale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top