• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Domanda OOP C# (o altri linguaggi) Come strutturarla

RonaldoCMS

Utente Attivo
8 Aprile 2012
257
7
29
Napoli
Miglior risposta
0
#1 Autore del topic
Ciao ragazzi, ho strutturato in questo modo un programma banalissimo, facendo autodidattica, sicuramente il programma è funzionante tralasciando dei bug che si possono creare, vorrei sapere se questo è un metodo adatto a livello sintattico. Vorrei sapere ai veterani ma anche persone che hanno piccole esperienze come lo strutturano un algoritmo di questo genere. Grazie a scusate per il tempo che mi dedicate

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*Programmazione ad oggetti in linguaggio Java: esercizi risolti
Esercizio no.1
Crea un programma dotato di una classe 'potenza' che implementa la potenza del 2 dei numeri (interi)
associati agli oggetti istanziati della classe .
La classe deve essere dotata di costruttore, di un metodo pow() che stampi a video la potenza del numero associato all'oggetto,
e di un metodo cambiobase()
che deve permettere di cambiare base alla potenza da calcolare.*/

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            potenza fatto = new potenza();
            fatto.main2();
     
        }

        public class potenza
            {
            public void main2()
            {

                int s, x, y, z;

            riprova:
                Console.WriteLine("1. Dato in input un numero, fare la potenza al quadrato");
                Console.WriteLine("2. Dato in input un numero e la potenza, leggere risultato");
                s = Convert.ToInt16(Console.ReadLine());
                switch (s)
                {
                    case 1:
                        {
                            Console.Write("inserisci numero: ");
                            x = Convert.ToInt32(Console.ReadLine());

                            z = pot(x);

                            Console.Write("Risultato: " + z);
                            Console.ReadKey();
                            break;
                        }
                    case 2:
                        {
                            Console.Write("inserisci numero: ");
                            x = Convert.ToInt32(Console.ReadLine());

                            Console.Write("inserisci base potenza: ");
                            y = Convert.ToInt32(Console.ReadLine());

                            z = cambio_base(x, y);
                            Console.Write("Risultato: " + z);
                            Console.ReadKey();
                            break;
                        }
                    default:
                        {
                            goto riprova;
                        }
                }
            }
                static int pot(int x)
                { 

                int y;
                return y = Convert.ToInt16(Math.Pow(x, 2));

                }

            static int cambio_base(int x, int y)
            {
                int z;
                return z = Convert.ToInt16(Math.Pow(x, y));
            }

        }
      
    }
}
 

TBH

Utente Master
24 Dicembre 2012
2.123
202
109
Salerno
Miglior risposta
0
#2
  • TBH

    TBH

RonaldoCMS @RonaldoCMS innanzitutto elimando il goto (esistono i cicli usali) ,poi rispettando un paio di regole basilari del oop:
-aggiungendo lo specificatore d'accesso agli attributi
-scrivendo le "azioni" dell'oggetto con metodi più consoni
- I nomi dei metodi e delle classi devono rispettare il camelcase (esempio la classe dovrebbe essere Potenza)

Oltre queste cose di leggibilità , una classe dovrebbe essere come una blackbox , cioè ricevere degli input e produrre output nascondendo parte delle operazione che hanno permesso di giungere a quel risultato (un po come un auto , l'autista non conosce esattamente come funziona il motore e interagisce con tutte le parti e per usarla non c'è bisogno di saperlo) , evitando comportamenti che non sono di sua competenza (nel tuo caso la lettura dell'input). Ecco come potrebbe essere strutturata Potenza
Codice:
public class Potenza{

public double Pow2(double number){
   return number*number;
}

public double Pow(double base,double y){
  return Math.Pow(base,y);
}
//N.b i metodi potrebbero essere tranquillamente statici evitando l'istanza , dato che non c'è un cambiamento di stato dell'oggetto.
}


//Startup
main(){
//lettura in input dei dati
//Istanza della classe e chiamata dei metodi opportuni
}
 

Tapatalk

Utente Esperto
28 Agosto 2013
1.269
90
53
20
Bellaria
Miglior risposta
3
#3
Per quanto riguarda la struttura, oltre le altre cose, ti consiglierei di dividere tutte le funzioni. Mi spiego: il tuo Main2 fa troppe cose. Generalmente una funzione dovrebbe fare una cosa e solo quella, poi volendo può anche usufruire di altre funzioni per fare quello che deve fare, però la cosa migliore è proprio separare tutto per funzioni di solito.
Inoltre, usando C# puoi sfruttare gli overload, ovvero creare due funzioni con lo stesso nome, ma che ricevono due parametri diversi in ingresso, diversi sia in tipo che in quantità (a volte). Ad esempio:
Codice:
public int calcolo(int numero){
       return numero*numero;
}
public int calcolo(int numero, int numero2){
       return numero*numero2;
}
E così via.
 

RonaldoCMS

Utente Attivo
8 Aprile 2012
257
7
29
Napoli
Miglior risposta
0
#4 Autore del topic
RonaldoCMS @RonaldoCMS innanzitutto elimando il goto (esistono i cicli usali) ,poi rispettando un paio di regole basilari del oop:
-aggiungendo lo specificatore d'accesso agli attributi
-scrivendo le "azioni" dell'oggetto con metodi più consoni
- I nomi dei metodi e delle classi devono rispettare il camelcase (esempio la classe dovrebbe essere Potenza)
Tecnicamente do in input tutto, creo funzioni e classi di calcolo dando tutto in output?
C'è a livello sintattico per me è molto chiaro pero' non capisco proprio come strutturarlo nel vero modo...
Tipicamente nel main faccio tutte le istruzioni in input e nelle classi tutti i blocchi divisi?
 

TBH

Utente Master
24 Dicembre 2012
2.123
202
109
Salerno
Miglior risposta
0
#5
  • TBH

    TBH

RonaldoCMS @RonaldoCMS innanzitutto elimando il goto (esistono i cicli usali) ,poi rispettando un paio di regole basilari del oop:
-aggiungendo lo specificatore d'accesso agli attributi
-scrivendo le "azioni" dell'oggetto con metodi più consoni
- I nomi dei metodi e delle classi devono rispettare il camelcase (esempio la classe dovrebbe essere Potenza)
Tecnicamente do in input tutto, creo funzioni e classi di calcolo dando tutto in output?
C'è a livello sintattico per me è molto chiaro pero' non capisco proprio come strutturarlo nel vero modo...
Tipicamente nel main faccio tutte le istruzioni in input e nelle classi tutti i blocchi divisi?
Vedi l'esempio del modello della classe che ho postato sopra.
La classe , rappresenta un astrazione ed opera su un determinato dominio .
Esempio :
Ad esempio una classe Wallet , si presuppone abbia una valuta,quantità di denaro
e che le operazioni che puoi fare sono : versare,prelevare,controllare la quantità di denaro.
Di conseguenza input/output e altre operazioni sono gestite da altri oggetti.
Detto in maniera molto semplificata , se una classe rappresenta una persona che sa mangiare e bere , gli unici codici contenuti nei vari metodi si dovranno occupare di mangiare e bere.
 
2 Febbraio 2015
110
21
24
Miglior risposta
0
#6
Non conosco il C# però da quanto ho visto posso dire con certezza che tu stai facendo "cattiva programmazione" o anche detto "hard coding". L'utilizzo di operatori come "goto" rendono il codice illeggibile e soprattutto difficile da recuperare in caso di loop. Ti consiglio di guardare la pagina wikipedia sulla "cattiva programmazione" e vedere come applicare le buone norme.
 

RonaldoCMS

Utente Attivo
8 Aprile 2012
257
7
29
Napoli
Miglior risposta
0
#7 Autore del topic
Non conosco il C# però da quanto ho visto posso dire con certezza che tu stai facendo "cattiva programmazione" o anche detto "hard coding". L'utilizzo di operatori come "goto" rendono il codice illeggibile e soprattutto difficile da recuperare in caso di loop. Ti consiglio di guardare la pagina wikipedia sulla "cattiva programmazione" e vedere come applicare le buone norme.
Si lo so, ho voluto utilizzare goto perchè lo ritengo molto piu' semplice applicarlo a questo problema anche se so che non è una buona programmazione, pero' la mia domanda era se devo utilizzare in questo modo la OOP
RonaldoCMS @RonaldoCMS innanzitutto elimando il goto (esistono i cicli usali) ,poi rispettando un paio di regole basilari del oop:
-aggiungendo lo specificatore d'accesso agli attributi
-scrivendo le "azioni" dell'oggetto con metodi più consoni
- I nomi dei metodi e delle classi devono rispettare il camelcase (esempio la classe dovrebbe essere Potenza)
Tecnicamente do in input tutto, creo funzioni e classi di calcolo dando tutto in output?
C'è a livello sintattico per me è molto chiaro pero' non capisco proprio come strutturarlo nel vero modo...
Tipicamente nel main faccio tutte le istruzioni in input e nelle classi tutti i blocchi divisi?
Vedi l'esempio del modello della classe che ho postato sopra.
La classe , rappresenta un astrazione ed opera su un determinato dominio .
Esempio :
Ad esempio una classe Wallet , si presuppone abbia una valuta,quantità di denaro
e che le operazioni che puoi fare sono : versare,prelevare,controllare la quantità di denaro.
Di conseguenza input/output e altre operazioni sono gestite da altri oggetti.
Detto in maniera molto semplificata , se una classe rappresenta una persona che sa mangiare e bere , gli unici codici contenuti nei vari metodi si dovranno occupare di mangiare e bere.
Grazie per il suggerimento.. :emoji_slight_smile:
 
2 Febbraio 2015
110
21
24
Miglior risposta
0
#8
Non conosco il C# però da quanto ho visto posso dire con certezza che tu stai facendo "cattiva programmazione" o anche detto "hard coding". L'utilizzo di operatori come "goto" rendono il codice illeggibile e soprattutto difficile da recuperare in caso di loop. Ti consiglio di guardare la pagina wikipedia sulla "cattiva programmazione" e vedere come applicare le buone norme.
Si lo so, ho voluto utilizzare goto perchè lo ritengo molto piu' semplice applicarlo a questo problema anche se so che non è una buona programmazione, pero' la mia domanda era se devo utilizzare in questo modo la OOP
RonaldoCMS @RonaldoCMS innanzitutto elimando il goto (esistono i cicli usali) ,poi rispettando un paio di regole basilari del oop:
-aggiungendo lo specificatore d'accesso agli attributi
-scrivendo le "azioni" dell'oggetto con metodi più consoni
- I nomi dei metodi e delle classi devono rispettare il camelcase (esempio la classe dovrebbe essere Potenza)
Tecnicamente do in input tutto, creo funzioni e classi di calcolo dando tutto in output?
C'è a livello sintattico per me è molto chiaro pero' non capisco proprio come strutturarlo nel vero modo...
Tipicamente nel main faccio tutte le istruzioni in input e nelle classi tutti i blocchi divisi?
Vedi l'esempio del modello della classe che ho postato sopra.
La classe , rappresenta un astrazione ed opera su un determinato dominio .
Esempio :
Ad esempio una classe Wallet , si presuppone abbia una valuta,quantità di denaro
e che le operazioni che puoi fare sono : versare,prelevare,controllare la quantità di denaro.
Di conseguenza input/output e altre operazioni sono gestite da altri oggetti.
Detto in maniera molto semplificata , se una classe rappresenta una persona che sa mangiare e bere , gli unici codici contenuti nei vari metodi si dovranno occupare di mangiare e bere.
Grazie per il suggerimento.. :emoji_slight_smile:
Eeheh questo è il punto. L'utilizzo del goto non è buona programmazione, quindi proprio contro la logica dell'OOP. L'OOP nasce per essere semplice al programmatore, e poi un'altra cosa che non mi è chiara:
Perchè dichiari statiche delle funzioni che puoi dichiarare semplicemente private?
Poi la classe è come una sorta di libreria, vedila così. Non ha senso scrivere la funzione principale in una classe secondaria. Al massimo scrivilo in una funzione ma nella classe primaria. La classe ti serve per immagazzinare dati o per avere funzioni a portata di mano utilizzando quei dati immagazzinati.
E ancora un'ultima cosa (lo so mi odierai per tutto questo xD), non fare classi interne quando non sono inerenti alla classe principale, ma falle esterne e poi importale all'interno della classe principale. Detto questo hai molto da migliorare, però dai, stai andando bene. Cosa fondamentale impara gli attributi di modifica (private, public, protected etc.) in modo da avere una visione chiara su dove e come utilizzarli. Continua così :emoji_slight_smile:
 
Mi Piace: RonaldoCMS
Shoutbox
  1. Mr. Aizen Mr. Aizen: Buondì
  2. Cristoforo58 Cristoforo58: Oggi faccio un anno di moderazione su Sciax2. Caro @#KiK, aspetto il tuo kaffettissimo!!1
  3. Cristoforo58 Cristoforo58: Da oggi il regolamento generale ha un nuovo punto sui BUMP, da ora in avanti ne è concesso solo uno a settimana: https://www.sciax2.it/forum/threads/regolamento-generale-sciax2-forum.1/
  4. xNebuolosa xNebuolosa: Bella
  5. Mr. Aizen Mr. Aizen: Buondì
  6. JaxosItalia JaxosItalia: https://www.sciax2.it/forum/threads/jaxos-hotel.700052
  7. #KiK #KiK: caz ho guadagnato 500 triliardoni di bitcoin, sono rikko secondo voi? xdd
  8. N NicolaTP: GUADAGNI 50$ facilmente convertibili in bitcoin https://www.sciax2.it/forum/threads/crypto-com-50-gratis-basta-solo-registrarsi.700221/ (disponibile a rispondere a qualsiasi dubbio)
  9. #KiK #KiK: YOLO
  10. JaxosItalia JaxosItalia: https://www.sciax2.it/forum/threads/jaxos-hotel.700052
  11. vinnythebest vinnythebest: LMAO
  12. Polare Polare: Cristoforo*
  13. Polare Polare: Cristo, attento alla bici!
  14. Cristoforo58 Cristoforo58: Amici amici e poi ti rubano la bici
  15. #KiK #KiK: Eh gia polaretto☹😫
  16. #KiK #KiK: Amiciii
  17. Polare Polare: @#KiK Finché ci sei tu, sciax2 vive!
  18. Polare Polare: Buonasera ragazzi!
  19. Danilo Danilo: Buonasera signori
  20. Alexstyle Retro Alexstyle Retro: https://www.sciax2.it/forum/threads/have-hotel-italia-15-07.700048/
  21. #KiK #KiK: Buonanotte amore mioooo🌝😂
  22. Mr. Aizen Mr. Aizen: Buondì
  23. tentao tentao: Guadagnia bitcoin grazie al tu browser https://www.sciax2.it/forum/threads/cryptotab-il-browser-che-ti-paga-bitcoin-2000shatoshi-per-registrarvi-pagante.700210/
  24. Xifor Xifor: https://www.sciax2.it/forum/threads/shell-hotel-old-crypto.700150/ OLD CRYPTO
  25. Alexstyle Retro Alexstyle Retro: https://www.sciax2.it/forum/threads/have-hotel-italia-15-07.700048/
Top