C
2.1 - Visibilità
Un aspetto molto importante, non solo per il C, ma per tutti i linguaggi di programmazione, è capire bene la visibilità delle variabili all'interno delle singole porzioni di codice (tra cui appunto, le funzioni).
Nell'esempio qui sotto vediamo definite 3 funzioni (a, b e c) e dichiarata una variabile "globale" (x). Queste dichiarazioni vengono inserite prima (e fuori) del metodo "main".
Nella main è poi definita un'altra variabile x che questa volta è "locale" (locale del metodo main), viene inserita una porzioni di codice all'interno di parentesi graffe, stabilendo una nuova "visibilità".
Infine viene di nuovo definita una variabile x all'interno dell'implementazione delle funzioni.
Enjoy!
/* Un esempio di visibilità */
#include <stdio.h>
void a(void);
void b(void);
void c(void);
int x = 1; // Variabile Globale
main()
{
int x = 5; // Variabil Locale
printf("Variabile Locale x in tutta main(): %d\n", x);
{ // Porzione con nuova visibilità
int x = 7;
printf("Variabile Locale x in una porzione di main(): %d\n", x);
}
printf("Variabile Locale x in tutta main(): %d\n", x);
a(); // var x locale automatica
b(); // var x locale statica
c(); // usa la var x globale
a();
b();
c();
printf("Variabile Locale x nella main(): %d\n", x);
return 0;
}
void a(void)
{
int x = 25;
printf("\nVariabile Locale x e' %d alla chiamata di a\n", x);
++x;
printf("Variabile Locale x e' %d all'uscita da a\n", x);
}
void b(void)
{
static int x = 50;
printf("\nVariabile Locale Statica x e' %d alla chiamata di b\n", x);
++x;
printf("Variabile Locale Statica x e' %d all'uscita da b\n", x);
}
void c(void)
{
printf("\nVariabile Globale x e' %d alla chiamata di c\n", x);
x *= 10;
printf("Variabile Globale x e' %d all'uscita da c\n", x);
}
Ultimo aggiornamento 09/09/2022 12:26:15
PHP
Step5: Prime tabelle per il menu
Iniziamo costruendo un paio di tabelle che ci serviranno per la nostra navigazione: una tabella relativa alle categorie per raggruppare voci di menu omogenee e una seconda per le voci di menu effettive.
t_cat_menu
id INTEGER PK NN AI
codice VARCHAR(5) NN UQ
descrizione VARCHAR(50) NN
ordine INTEGER NN
t_menu
id INTEGER PK NN AI
codice VARCHAR(5) NN UQ
descrizione VARCHAR(50) NN
md5 VARCHAR(50) NN
url VARCHAR(50) NN
pubblicato BOOLEAN NN
idCategoria INTEGER NN
idPadre INTEGER
ordine INTEGER NN
Per quanto riguarda il campo “boolean” un tempo, sui vecchi MySql non era previsto e si usava il tipo dati “TINYINT” di lunghezza 1, ma oramai si sono evoluti anche loro, potenza della Oracle!
Le due tabelle hanno quindi una relazione uno a molti tra la categoria e le relative voci di menu.
Costruiamo 2 classi che siano aderenti a queste 2 tabelle create.
catMenu.class.php:
//CATEGORIA DEL MENU
class catMenu
{
var $id;
var $codice;
var $descrizione;
var $ordine;
function __construct()
{
}
}
4 attributi che corrispondono ai 4 campi della tabella. Il costruttore va previsto, ma in questo caso non ci serve molto e possiamo lasciarlo vuoto, potremmo utilizzarlo ad esempio per preimpostare qualche campo…
Creiamo poi i metodi per le classiche operazioni di lettura della lista dei record, di dettaglio di un singolo record, di update, di delete.
Se vogliamo lavorare con un vero modello 3-tier parcheggiamo i dati estratti dal database su delle collection in memoria.
Un metodo “getList” potrebbe quindi essere:
function getList()
{
global $db;
global $errorMsg;
try
{
$sql = "SELECT * FROM t_cat_menu ORDER BY ordine";
if(!$db->query($sql))
throw new Exception($errorMsg, 0);
while ($rowCatMenu = $db->row())
{
$id = $rowCatMenu["id"];
$hashtable[$id] =
array( "id" => $id
,"codice" => $rowCatMenu["codice"]
,"descrizione" => $rowCatMenu["descrizione"]
,"ordine" => $rowCatMenu["ordine"]
);
}
return $hashtable;
}
catch (Exception $ex)
{
$errorMsg = $ex->getMessage();
}
}
Usiamo 2 variabili globali ($db e $errorMsg) in modo da centralizzare nella index.php la connessione al database (che ovviamente comunque non è persistente e viene istanziata ad ogni action) e una unica variabile contente la messaggistica (non necessariamente solo di errore) che viene poi visualizzata in una precisa posizione della pagina.
Per i dati estratti costruiamo delle hashtable, con le n-uple costituite da accoppiate chiave – valore.
Le classi costruite quindi costituiscono il livello dell’applicativo che lavora sui dati. L’SQL che opera sul DB deve essere presente SOLO QUI!
In modo del tutto identico possiamo costruire le classe per la tabella t_menu:
menu.class.php
class menu
{
var $id;
var $codice;
var $descrizione;
var $md5;
var $url;
var $categoria;
var $ruolo;
var $pubblicato;
var $ordine;
var $id_padre;
}
Questi sono gli attributi e qui sotto il metodo getList:
function getList($categoria = null)
{
global $db;
global $errorMsg;
try
{
$sql = "SELECT * FROM t_menu m
LEFT JOIN t_cat_menu c ON m.id_categoria = c.id ";
if ($categoria != null) { $sql .= "WHERE m.id_categoria = ".$categoria; }
$sql .= " ORDER BY c.ordine, m.ordine";
if (!$db->query($sql))
throw new Exception($errorMsg, 0);
while ($rowMenu = $db->row())
{
$id = $rowMenu["m.id"];
$hashtable[$id] =
array ( "id" => $id
,"codice" => $rowMenu["m.codice"]
,"descrizione" => $rowMenu["m.descrizione"]
,"md5" => $rowMenu["m.md5"]
,"url" => $rowMenu["m.url"]
,"codiceCategoria" => $rowMenu["c.codice"]
,"pubblicato" => $rowMenu["m.pubblicato"]
,"ordine" => $rowMenu["m.ordine"]
);
}
return $hashtable;
}
catch (Exception $ex)
{
$errorMsg = $ex->getMessage();
}
}
L’unica differenza rispetto al getList delle categorie di menu è che qui viene gestito un parametro (facoltativo) che se valorizzato viene utilizzato per filtrare le voci di menu relativa alla categoria passata a parametro.
Direi che vi ho martellato abbastanza, alla prossima!
Ultimo aggiornamento 16/01/2020 10:00:41