Penso che per capire questa domanda, devi capire cos'è un'astrazione. (Sono troppo pigro per trovare una definizione formale, quindi sono sicuro che sto per venir maneggiato, ma qui va ...) Un'astrazione è quando prendi un soggetto o un'entità complessi e nascondi la maggior parte dei suoi dettagli esponendo la funzionalità che definisce ancora l'essenza di quell'oggetto.
Credo che l'esempio che il libro ti ha dato fosse una casa. Se guardi in modo molto dettagliato la casa, vedrai che è fatta di tavole, chiodi, finestre, porte ... Ma un disegno a fumetti di una casa accanto a una fotografia è ancora una casa, anche se manca molti di questi dettagli.
La stessa cosa con il software. Ogni volta che si programma, proprio come il libro consiglia, è necessario pensare al proprio software come livelli. Un dato programma può facilmente avere oltre cento strati. Nella parte inferiore, potresti avere istruzioni di assemblaggio che girano su una CPU, a un livello più alto queste istruzioni potrebbero essere combinate per formare routine di I / O su disco, ad un livello ancora più alto, non è necessario lavorare con Disk I / O direttamente perché puoi usare le funzioni di Windows semplicemente per aprire / leggere / scrivere / cercare / chiudere un file. Queste sono tutte astrazioni anche prima di arrivare al tuo codice applicazione.
All'interno del tuo codice, i livelli di astrazione continuano. Potresti avere routine di stringa / rete / manipolazione dei dati di livello inferiore. Ad un livello superiore è possibile combinare tali routine in sottosistemi che definiscono la gestione degli utenti, il livello dell'interfaccia utente, l'accesso al database. Ancora un altro livello questi sottosistemi potrebbero essere combinati in componenti server che si uniscono per diventare parte di un sistema aziendale più grande.
La chiave per ciascuno di questi livelli di astrazione è che ognuno nasconde i dettagli esposti dai precedenti layer e presenta un'interfaccia molto pulita da consumare dal livello successivo. Per aprire un file, non dovresti sapere come scrivere singoli settori o quali interrupt hardware elaborare. Ma se inizi a percorrere la catena del livello di astrazione, sarai sicuramente in grado di risalire dalla chiamata della funzione Write (), fino all'istruzione esatta che viene inviata al controller del disco rigido.
Ciò che l'autore ti sta dicendo di fare è quando definisci una classe o una funzione, pensa a quale livello sei uno. Se si dispone di una classe che gestisce sottosistemi e oggetti utente, la stessa classe non deve eseguire manipolazioni di stringhe di basso livello o contenere un intero gruppo di variabili solo per effettuare chiamate socket. Questa sarebbe la violazione dei livelli di astrazione incrociati e anche di avere una classe / funzione fare una sola cosa (SRP - Single Responsibility Principle).