Sto lavorando con Linux incorporato per un router. C'è una GUI Web per l'utente per configurare le opzioni del router. Quando l'utente carica un modulo Web, questo viene inviato a una funzione del server Web che è responsabile della convalida dell'input dell'utente, salva la configurazione e riavvia alcuni servizi. Ad esempio, la funzione per modificare le impostazioni DNS fa qualcosa del genere:
#include <cms_dal.h>
#include <runservices.h>
void dnsform (form *input)
{
DNS_T dns;
char *dnsenable;
char *dns1;
char *dns2;
dnsenable = GetFormVar(input, "dnsenable", ""); // Get value in the POST request for the form field named dnsenable
dns1 = GetFormVar(input, "dns1", "");
if (!isValidIPAddress(dns1)) // Validate User Input
goto DNS_error;
dns2 = GetFormVar(input, "dns1", "");
if (!isValidIPAddress(dns1))
goto DNS_error;
/* Fill DNS_T dns before saving to the configuration */
if (atoi(dnsenable))
dns.enable=1;
else
dns.enable=0;
inet_aton(dns1, &dns.dns1);
inet_aton(dns1, &dns.dns2);
/* Save new conf */
cm_dal_set(DNS_ID, (void*)&dns);
/* Restart DNS Server */
dns_server_restart();
DNS_error:
ERR_400(); // Return 400 error to the browser
}
cms_dal.h
è la libreria con i metodi per salvare / recuperare i parametri di configurazione dalla memoria permanente. Questa libreria implementa la funzione cms_dal_set()
e definisce DNS_ID
e anche il tipo DNS_T
. runservices.h
contiene il metodo dns_server_start()
.
Il router ha anche un'interfaccia a riga di comando, e la funzione per applicare le impostazioni DNS usando l'interfaccia a riga di comando ha la funzione sopra la funzione web server.
Penso che dovremmo meglio astrarre alcuni strati leggermente coesi. Questo è, il server web o l'interfaccia della riga di comando non dovrebbe sapere nulla sul tipo DNS_T in quanto è un problema di implementazione della libreria cms_dal
su come memorizza e recupera i dati dalla memoria flash.
Vorrei separare la convalida, il salvataggio e l'impostazione del servizio DNS (come oggetto dominio) dalle interfacce utente del router. Forse posso creare un ADT che incapsula l'oggetto Server DNS, quindi può esporre alcune interfacce per convalidare, salvare e impostare la configurazione dell'oggetto DNS. Quindi la funzione del server web potrebbe essere simile a questa:
#include <dns_server_tad.h>
void dnsform (form *input)
{
char *dnsenable;
char *dns1;
char *dns2;
dnsenable = GetFormVar(input, "dnsenable", ""); // Get value in the POST request for the form field named dnsenable
dns1 = GetFormVar(input, "dns1", "");
dns2 = GetFormVar(input, "dns1", "");
if (!isValidDNS (dnsenable, dns1, dns2))
ERR_400(); // Return 400 error to the browser
if (!saveDns(dnsenable, dns1, dns2))
ERR_500(); // Return 500 error to the browser
/* Restart DNS Server */
restartdns();
}
Sto pensando a pro e contro facendo sopra o su modi migliori per fare lo stesso. Penso che alcuni professionisti siano:
- Interfacce utente non implementare la convalida dell'oggetto dominio due volte.
- Possiamo implementare il test delle unità per i nuovi livelli astratti.
- Miglioriamo la coesione e l'astrazione del codice.
Informazioni sul nuovo oggetto DNS incapsulante ADT, questo ADT dovrebbe essere parte della libreria cms_dal.h
? Questo TAD dovrebbe esporre solo la funzione int restartDNS(char *dnsenable, char *dns1...)
e eseguire internamente la validazione e il salvataggio dei parametri? Se voglio fare lo stesso per l'oggetto Firewall (set di regole di filtro), il nuovo ADT dovrebbe esporre un nuovo tipo di dati pubblici che rappresenta una raccolta di regole di filtro per le interfacce utente da visualizzare / impostare? Sono disposto ad ascoltare le idee che migliorano la progettazione e la pulizia del codice di questo progetto.