Ambito di Visibilità all'interno delle classi

di il
13 risposte

Ambito di Visibilità all'interno delle classi

Salve

Scusate la stupidità della domanda ma sono alle prime armi con C#

Io ho una istanziato  Classe Connessioni

Class Connessioni
	{
		public  GestoreConnessioniTipo_1 ConnessioniTipo_1;
		
		public  GestoreConnessioniTipo_2 ConnessioniTipo_2;
	 
	}

che possiede 2 membri che a loro volta sono 2 classi indipendenti tra loro

	class GestoreConnessioniTipo_1
	{
		publig WorkFunction
		{
				do something			
		}
	}	
	class GestoreConnessioniTipo_2
	{
		publig WorkFunction
		{
				do something			
		}
	}

Avrei necessita che le singole WorkFunction delle classi istanziate all'interno della classe Connessioni potessero gestire informazioni

accessibili dalla WorkFunction dell'altra classe e viceversa…

E' possibile fare questo?

13 Risposte

  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - MircoSoft ha scritto:


    Avrei necessita che le singole WorkFunction delle classi istanziate all'interno della classe Connessioni potessero gestire informazioni

    accessibili dalla WorkFunction dell'altra classe e viceversa…

    A livello di tipi, tutto ciò che è pubblico è tranquillamente accessibile: basta passare un riferimento all'oggetto desiderato.

    Al netto di questo, mi pare a prima vista una struttura farraginosa e dubito che abbia una giustificazione tecnica o di design plausibile, ma non sapendo a cosa servono quelle classi nello specifico, difficile dire altro.

  • Re: Ambito di Visibilità all'interno delle classi

    Se ho capito bene dovrei modificare il codice in questo modo?

    Class Connessioni
    	{
    		public  GestoreConnessioniTipo_1 ConnessioniTipo_1(this);
    		
    		public  GestoreConnessioniTipo_2 ConnessioniTipo_2(this);	 
    	}
  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - MircoSoft ha scritto:


    Se ho capito bene dovrei modificare il codice in questo modo?

    Questo codice non è compilabile, e non si capisce cosa rappresentino quei metodi: sono costruttori? metodi tradizionali?

    Vedo un po' di confusione in generale. La problematica non è relativa al codice in sé, ma nel design della modellazione delle classi.

  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - MircoSoft ha scritto:


    Avrei necessita che le singole WorkFunction delle classi istanziate all'interno della classe Connessioni potessero gestire informazioni

    accessibili dalla WorkFunction dell'altra classe e viceversa…

    Ciao, 

    premetto che concordo con Alka 

    Ad ogni modo per fare riferimento ad una classe diversa è sufficiente anteporre il nome della classe è avrai accesso a tutte le istanze public che hai dichiarato.

    Se la classe Connessioni è dichiarata Public in quansiasi altra classe sarà visibile richiamando la classe stessa
    Oppure referenziarla con la using nella classe dove si vuole richiamare i vari suoi metodi o altre istanze public
    
    Nel caso di metodi un esempio sarà :
    
    ------------------------------------
    public class MyClass1 
    {
    	public static MyFunction1()
    	{
    		MyClass2.MyFunction2();
    		....
    		........
    	}
    }
    
    ------------------------------------
    public class MyClass2
    {
    	public static MyFunction2()
    	{
    		MyClass1.MyFunction1();
    		.....
    		..........
    	}
    }

    Ma per come hai esposto l'esempio, il costrutto non mi è chiaro e non saprei aggiungere altro

    Attenzione che in questo esempio si va in loop ricorsivo ;-)

  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - By65Franco ha scritto:


    per fare riferimento ad una classe diversa è sufficiente anteporre il nome della classe è avrai accesso a tutte le istanze public che hai dichiarato

    A patto che, come hai fatto tu, i metodi siano dichiarati static altrimenti ciccia.

    09/10/2023 - MircoSoft ha scritto:


    Avrei necessita che le singole WorkFunction delle classi istanziate all'interno della classe Connessioni potessero gestire informazioni

    accessibili dalla WorkFunction dell'altra classe e viceversa…

    Come dice ovviamente Alka, stai complicando una situazione semplice. Così di prima impressione non ti servono le sottoclassi. Ne basta una sola che esponga i due metodi. Cerca di dettagliare meglio il contesto.

  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - Sgrubak ha scritto:


    A patto che, come hai fatto tu, i metodi siano dichiarati static altrimenti ciccia.

    Ciao, … beh direi di si 

    Secondo me si stà complicando la vita… si capisce poco il contesto, dovrebbe spiegarsi un po' meglio di cosa vuole ottenere.

    Anche il fatto di dare lo stesso nome agli oggetti non è molto consigliabile, si rischia ambiguità e non è un bene…

    Comunque vediamo se ci spiega meglio il contesto etc etc etc…  così si entra solo nel campo dell'ipotesi.

    ;-) 

  • Re: Ambito di Visibilità all'interno delle classi

    Salve

    Ho modificato il codice in questo modo

    Class Connessioni
    	{
    		public classDati myDati = new calssDati;
    		
    		public  GestoreConnessioniTipo_1 ConnessioniTipo_1(myDati);
    		
    		public  GestoreConnessioniTipo_2 ConnessioniTipo_2(myDati);	 
    	}

    in modo che la prima classe possa popolare i dati

    e la seconda li utilizzi

  • Re: Ambito di Visibilità all'interno delle classi

    09/10/2023 - MircoSoft ha scritto:


    in modo che la prima classe possa popolare i dati

    e la seconda li utilizzi

    Ma perché mai le seconde classi devono stare dentro le prime?
    Non ce n'è motivo alcuno.

    E se ne conoscessi il reale motivo, credo lo criticherei ancora di più. :)

    Questa struttura non ha un senso apparente.

  • Re: Ambito di Visibilità all'interno delle classi

    A parte gli errori di sintassi, stai proprio invalidando il principio d'incapsulamento. I campi della Classe devono essere privati. Se la prima classe popola e la seconda legge, perché non utilizzi una logica generativa stile Builder? Ammesso che io abbia capito, propenderei per un GestoreConnessioneBuilder che nell'interfaccia preveda un metodo Build il quale, una volta validati i parametri tramite proprietà, ritorni un GestoreConnessione valido. Per rendere l'idea, visto che parli di connessioni, non ti saranno estranee le interfaccie DbConnectionString ed il relativo DbConnectionStringBuilder dell'ADO.NET.

    Esistono altre logiche, ma questa mi pare la più calzante.

  • Re: Ambito di Visibilità all'interno delle classi

    Salve

    ho semplificato il tutto per fare la domanda ma ho paura di avere complicato il tutto

    Spiego lo scopo del programma che sto cercando di implementare:

    Lo scopo del programma e' di fare da raccolta dati Continua da dispositivi presenti in impianto (plc o altro) e notificare le variazioni di alcune variabili ad una serie di supervisori (se riesco vorrei sostituire il vecchio programma in VB6)

    La prima classe si occupa della comunicazione continua verso le macchine 

    (al suo interno utilizzo un Task per connessione per migliorare le prestazioni del vecchio programma che lavorava in sequenza)

    Una volta ricevuta risposta e verificata l'effettiva variazione rispetto alla lettura precedente

    Deve essere comunicata a tutti i supervisori interessati

    Il vecchio programma preparava un pacchetto informativo che inseriva in una struttura dati Globale che fungeva da “Coda di trasmissione”

    La seconda classe si occupa di gestire e mantenere attiva la comunicazione con i supervisori e gestire l'invio delle notifiche scansionando la “Coda di Trasmissione” verificando l'effettivo recapito della notifica ai supervisori interessati

  • Re: Ambito di Visibilità all'interno delle classi

    10/10/2023 - MircoSoft ha scritto:


    Spiego lo scopo del programma che sto cercando di implementare […]

    Ora lo scopo è chiaro, ma appunto non è chiaro qual è il senso dell'architettura che hai implementato e dell'annidamento dei tipi che hai fatto rispetto al risolvere l'esigenza di cui parli, fermo restando che si parla solo di connessioni ai dati mentre qui ci sono una gamma molto più ampia di ambiti da analizzare, progettare e implementare (comunicazioni con i dispositivi, gestione operazioni asincrone e multithreading, raccolta dei dati, salvataggio, sincronizzazione, ecc).

    A parte suggerire di semplificare il più possibile, dal mio punto di vista è indispensabile aver chiaro il funzionamento del paradigma OOP, magari applicando i principi SOLID (ho fatto di recente un webinar sull'argomento).

    Ciao!

  • Re: Ambito di Visibilità all'interno delle classi

    10/10/2023 - MircoSoft ha scritto:


    Lo scopo del programma e' di fare da raccolta dati Continua da dispositivi presenti in impianto (plc o altro) e notificare le variazioni di alcune variabili ad una serie di supervisori (se riesco vorrei sostituire il vecchio programma in VB6)

    Dicesi SCADA (Schneider, Aveva, Siemens, Movicon, scegli tu il prodotto che più si addice alle tue esigenze) …. poi comprendo che il costo delle licenze possa essere elevato.

  • Re: Ambito di Visibilità all'interno delle classi

    In effetti e' l'implementazione del “Motore” di uno Scada

    ma si tratta solo del "modulo" di acquisizione di Segnali dal Campo" da notificare al Programma Vero   che poi in base alle segnalazioni operarà in ambiti che uno SCADA non prevede…

    Premetto che sto facendo questo come esercizio per imparare la programmazione C#

    in quanto non ho la possibilità di vedere da vicino programmi Completi e di una certa entità realizzati in C#

    Ho la necessita di stabilire diverse connessioni con PLC o altri dispositivi per recuperare alcuni valori (pochi da ognuno, ma negli impianti più grossi posso arrivare anche a una cinquantina di PLC)

    Alcuni Valori vanno letti in continuazione altri Letti/Scritti solo su richiesta dei Vari Supervisori/Gestori di Impianto

    Ho implementato l'oggetto Connessione Generica (che al momento “dell'istaziamento” verrà specializzato in base al plc e alle aree di memoria da leggere su quello specifico plc) e questo per i protocolli implemntati finora funziona.

    Ogni oggetto possiede un Task per la “Gestione” della Connessione in modo da essere “indipendente” una volta instanziata.

    Una volta ottenute le informazioni dai PLC  ho la necessità (in caso di variazione) notificarlo  a tutti o solo ad alcuni dei supervisori configurati.

    A tal proposito ho implementato un secondo oggetto che si dovrà occupare di di gestire la comunicazione via Socket UDP con i supervisori

    Visto che sono alle prime armi sono arrivato al punto che ricevo i dati dal plc connesso e poi non sapevo piu' come fornirli al “postino”

    per ovviare al problema ho istanziato una lista per telegrammi nelle classe Contenitore e passata come parametro nel costruttore di entrambi gli oggetti al momento della loro instanziazione (50 volte la prima classe per i PLC, 5 volte la seconda per i supervisori)

     Quale sarebbe stata l'implementazione migliore?

Devi accedere o registrarti per scrivere nel forum
13 risposte