• 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
262
8
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.128
204
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.264
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
262
8
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.128
204
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
140
46
34
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
262
8
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
140
46
34
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. #KiK #KiK: caz prenditi un kaffè kik e vedi come vola il tuo progetto
  2. #KiK #KiK: con tutti sti beta testers che hai non hai finito sto progetto lolle
  3. -Sicily94- -Sicily94-: Cerco beta testers, o persone che cercando un retro fatto come si deve: https://www.sciax2.it/forum/threads/progetto-sicily-hotel-beta-test-serio.700314/
  4. #KiK #KiK: vi querelo alle proprie proprietà giudiziare
  5. #KiK #KiK: ma quanti caz di messaggi avete inviato animali
  6. Y YOUNGBLOOD BSS: Era tutto più bello e sopratutto coinvolgente
  7. Y YOUNGBLOOD BSS: Vero role play non come dicono di farlo adesso
  8. Y YOUNGBLOOD BSS: Era fantastico
  9. Y YOUNGBLOOD BSS: Io facevo le battle di freestyle su bss e bobba
  10. Y YOUNGBLOOD BSS: Lo spero davvero, ma io penso che sia diventato così per il semplice motivo che è diventato tutto una cosa di chi vuole essere rankato e di quei giochini di merda che fanno gli staff.
  11. Nyhet Nyhet: @YOUNGBLOOD BSS Purtroppo è grazie all'incompetenza vi vari staff che i retro e habbo ufficiale siano quasi collassati. Speriamo che i retro possano dare una nuova luce al Virtual World's. Ti chiedo gentilmente di attendere con buona pazienza l'apertura di Habbet Italia. Stiamo lavorando affinché sia tutto pronto per accogliervi. Seguici su DiscordAPP. Grazie e buona serata.
  12. Y YOUNGBLOOD BSS: Mi si spezza il cuore a vedere che i retro e habbo in generale siano falliti ero accanito un botto nel 2012... Mi ricordo bobba con 1400 utenti online.... Bei tempi 😔
  13. Y YOUNGBLOOD BSS: Qual è il retro con più utenza?
  14. Y YOUNGBLOOD BSS: L'unico con un utenza ragionevole è Habboon ma è straniero e nemmeno italiank
  15. Y YOUNGBLOOD BSS: C'è un utenza imbarazzante dappertutto
  16. Y YOUNGBLOOD BSS: Ma che è successo ai retro?
  17. Y YOUNGBLOOD BSS: Buonasera raga
  18. #KiK #KiK: we
  19. Cosimo Celeste Cosimo Celeste: @Nyhet ti invito a leggere la mia risposta all'interno del thread di Habbet
  20. Them Them: @Nyhet ;-)
  21. Nyhet Nyhet: @Them Grazie per aver postato il nostro Hotel ;)
  22. Them Them: https://www.sciax2.it/forum/threads/habbet-hotel.700733/#post-4376741
  23. #KiK #KiK: We
  24. vinnythebest vinnythebest: Cerco sviluppatore Java per Arcturus.
  25. #Egzon14 #Egzon14: https://www.sciax2.it/forum/threads/webbocms-habbor.700729/
Top