Vai al contenuto

Appunti del 30/03/2023⚓︎

Stile di programmazione⚓︎

K&R coding style⚓︎

Kernigan & Richie

Prevedevano 4/8 spazi per l'indentazione per evitare l'annidamento eccessivo. Troppo annidamento è in genere segnale di cattiva progettazione.

C
int compare(int x, int y) 
{
        if (x < y) {
                return -1;
        } else if (x > y) {
                return 1;
        } else {
            return 0;
        }
}

Modularizzazione e strutturaione dei programmi dei files⚓︎

bisogna prima definire le interfacce tra i moduli.

ciò che succede nel modulo 1 non interessa al modulo 2. ciò che conta è sapere che riceverà quella struttura dati A organizzata in quel modo. questa è l'indipendenza.

la suddivisione in moduli va pensata ovviamente. bisogna quindi pensare quali saranno i moduli indipendenti da creare.

obv prima in pseudo e poi in C.

Programmazione in grande⚓︎

riguarda i programmi costituiti da più moduli, ovvero più files/librerie/altro. il file C non è un file singolo ma ce ne saranno di più. bisgona individuare la struttura migliore che permetta di mantenere la struttura che garantisca leggibilità, modificabilità e correttezza.

Progetto modulare⚓︎

è un insieme di moduli separati ma cooperanti tra loro secondo l'architettura del sistema sotfware.

modulo: interfaccia e implementazione.

interfaccia:

  • le risorse esportate dal modulo
  • è la parte pubblica, ovvero il "cosa". definisce cosa fa il modulo
  • è il file header .h

implementazione (o corpo)

  • meccanismi che realizzano le funzioni
  • parte "privata", ossia il "come"
  • chi utilizza il modulo non deve sapere il come ma solo il cosa.
  • è il file sorgente .c

dunque modulo1.h e modulo1.c costituiscono un modulo. In modulo1.h si mettono tutte le intestazioni di tutte le funzioni o varaibili che si vuole che vengano utilizzate. nel modulo1.c si mette tutto, corpo e tutto il resto che sia pubblico o privato.

ad esempio

mat.h
int somma(int a, int b);
int prodotto(int, int);
mat.c
1
2
3
int somma(int a, int b) { return a + b; }

int prodotto(int a, int b) { return a * b; }

Cosa contiene un header⚓︎

dichiarazioni dei metori da implementare, dette forward reference

variabili, dette variabili extern ossia var pubbliche definite in altri moduli.

costanti definite con la direttiva #define

Vantaggi della programmazione modulare⚓︎

team di programmatori possono lavorare sui programmi.

ogni file definisce un particolare tipo di oggetto come un tipo di dati e di operazioni su tale oggetto.

separare la dichiarazione del modulo dalla sua implementazione rende un programma ben strutturato e di facile manutenzione.

un file può mantenere tutte le funzioni/operazioni su matrici ed essere usato da un prog di biblioteca.

è buona pratica iniziare un file .h con il seguente blocco per evitare inclusioni multiple

example.h
1
2
3
4
5
6
#ifndef EXAMPLE_H
#define EXAMPLE_H

// corpo di example.h

#endif /* ifndef EXAMPLE_H */

è un grave errore quello di scrivere codice in un file .h e poi includerlo nel file .c.