DOMANDA Il mio primo programma C# - Che ne pensate? Consigli?

TheLastViper

Nuovo Utente
8
2
CPU
Intel core i5 - 4590
Scheda Madre
ASUS H81I-PLUS
HDD
SSD 120/128 GB SATA
RAM
DDR3-1600 DIMM 8GB
GPU
KFA Geforce GTX 1060 OC
Audio
Logitech 5.1 Sound system 75W
Monitor
24"(60.9 cm) Full HD monitor gaming
Periferiche
Wireless keyboard with touchpad + Logitech G29 steering wheel/pedal set
Net
Fastweb ADSL2+ 20Mb
OS
Windows 10
Ciao a tutti :)
Mi sono appena iscritto e questa è la mia prima discussione quindi spero di non stare violando qualche regolamento di cui non sono a conoscenza. Per motivi lavorativi sto attualmente studiando il linguaggio C#. Per questo volevo semplicemente chiedervi cosa ne pensate del mio primo programma C#. L'ho scritto in un paio di giorni e questo linguaggio è completamente nuovo per me, quindi vi chiedo scusa se è poco ottimizzato o non molto comprensibile a livello di logica, purtroppo sono ancora abituato al mio amato C++ e alla sua logica "sequenziale" mentre in C#, come in Java, si fa molto riferimento ai concetti di 'classe' e di 'metodo', concetti nuovi per me. Con questa discussione volevo semplicemente chiedervi consigli, magari potete aiutarmi ad ambientarmi con questa nuova logica o magari avete consigli direttamente legati alla programmazione del mio progetto. Grazie a tutti in anticipo, chiedo scusa se mi sono dilungato :)

Di seguito il codice di cui vi ho parlato, altro non è che una calcolatrice ma con alcune funzioni in più, attualmente sto sviluppando la modalità "segreta" sviluppatore, poi provvederò a convertire le variabili in tipo 'decimal' per una maggiore precisione per certe operazioni:

C#:
#region USING
using System;
using System.Collections;
using System.Windows;
using System.Timers;
using System.Threading;
/* *LIBRERIE EXTRA*
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;/using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions; */
#endregion

#region NAMESPACE
namespace ECALC
{

    #region CLASS    
    class Program
    {

        #region WARNINGS/ERRORS        
        /* *WARNING TEST*
        #pragma warning disable CS1030
        #warning <WARNING> */
        #pragma warning disable IDE0060
        #pragma warning disable IDE0059
        #pragma warning disable CS0219
        #endregion

        #region METODI
        /* // *METODO TIMER - TEST*
        // private static readonly System.Timers.Timer Timer = new System.Timers.Timer();
        // private static System.Timers.Timer aTimer; 
         
        private static void Elapsed(Object source, ElapsedEventArgs e)
        {
            Console.WriteLine("");
        }
        private static void SetTimer()
        {
            aTimer = new System.Timers.Timer(5000)
            {
                Enabled = true
            };
        }*/

        // *METODO CONTROLLO CARATTERI*
        public static int VerificaNumero(string valoreDaControllare)
        {
            int ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = Int32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.Clear();
                Messaggio();
                Console.WriteLine("\n\n");
                Menu();
                Console.Write("ENTER A NEW NUMERICAL CHARACTER: ");
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;

            /*do {
              try {
                  numero = int.Parse(Console.ReadLine());
                  return true;
              } catch (FormatException) {
                  Console.WriteLine("ERROR! NOT SUPPORTED CHARACTER TYPE. ");
                  return false;
              }
            } while (a != 1); */
        }

        // *SECONDO METODO CONTROLLO CARATTERE*
        public static int VerificaNumero2(string valoreDaControllare)
        {
            int ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = Int32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.WriteLine("\n");
                Messaggio();
                Messaggio2();
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;

            /*do {

              try {
                  numero = int.Parse(Console.ReadLine());
                  return true;
              } catch (FormatException) {
                  Console.WriteLine("ERROR! NOT SUPPORTED CHARACTER TYPE. ");
                  return false;
              }

            } while (a != 1); */
        }

        // *TERZO METODO CONTROLLO CARATTERE*
        public static uint VerificaNumero3(string valoreDaControllare)
        {
            uint ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = UInt32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.WriteLine("\n");
                Messaggio();
                Messaggio2();
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;

            /*do {

              try {
                  numero = int.Parse(Console.ReadLine());
                  return true;
              } catch (FormatException) {
                  Console.WriteLine("ERROR! NOT SUPPORTED CHARACTER TYPE. ");
                  return false;
              }

            } while (a != 1); */
        }

        // *METODO MENU*
        public static void Menu()
        {
            Console.WriteLine("OPTIONS: \n\n");
            Console.WriteLine("1. SUM; \n");
            Console.WriteLine("2. SUBTRACTION; \n");
            Console.WriteLine("3. MULTIPLICATION; \n");
            Console.WriteLine("4. DIVISION; \n");
            Console.WriteLine("5. SQUARE ROUND; \n");
            Console.WriteLine("6. EXPONENTIATION; \n");
            Console.WriteLine("7. FACTORIAL; \n");
            Console.WriteLine("8. TETRATION; \n");
            Console.WriteLine("9. CUBIC ROOT; \n");
            Console.WriteLine("10. PERCENTAGE; \n");
            Console.WriteLine("0. EXIT; \n\n");
        }

        // *METODO MESSAGGIO*
        public static void Messaggio()
        {
            Console.WriteLine("ERROR! NOT SUPPORTED CHARACTER TYPE. ");
        }

        // *METODO MESSAGGIO 2*
        public static void Messaggio2()
        {
            Console.Write("ENTER THE REQUIRED DATA: ");
        }

        /*  *TEST METODO* 
           static public void soloNumeri(KeyPressEventArgs ev) {
            if (!IsNumeric(ev.KeyChar.ToString()) & amp; &amp; (((int)ev.KeyChar) != 8))
            ev.Handled = true;
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e) {
            soloNumeri(e);
        }
        */

        // *METODO CONTROLLO SECRET_CODE*
        public static int VERIFICA_SECRET_CODE(string valoreDaControllare)
        {
            int ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = Int32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.WriteLine("\n");
                Messaggio_SC();
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;
        }

        // *METODO MESSAGGIO SC*
        public static void Messaggio_SC()
        {
            Console.Write("ERROR! ENTER THE SECRET CODE: ");
        }

        // *METODO CONTROLLO SECRET_CODE2*
        public static int VERIFICA_SECRET_CODE_2(string valoreDaControllare)
        {
            int ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = Int32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.WriteLine("\n");
                Messaggio_SC_2();
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;
        }

        // *METODO MESSAGGIO SC*
        public static void Messaggio_SC_2()
        {
            Console.Write("ERROR! ENTER THE CORRECT SECRET CODE: ");
        }

        public static int VERIFICA_CHOICE(string valoreDaControllare)
        {
            int ValoreControl = 0;
            int a = 0;
            bool res = false;
            do
            {
                res = Int32.TryParse(valoreDaControllare, out ValoreControl);
                if (res == true)
                {
                    break;
                }
                Console.WriteLine("\n");
                Messaggio_SC1();
                // Console.ReadLine();
                valoreDaControllare = Console.ReadLine();
            } while (a != 1);

            return ValoreControl;
        }

        // *METODO MESSAGGIO SC1*
        public static void Messaggio_SC1()
        {
            Console.Clear();
            Console.WriteLine("ENTER A CORRECT CHOICE! \n\n");
            Console.WriteLine("CHOOSE AN OPTION: ");
            Console.WriteLine();
            Console.WriteLine("1. ADD PARAMS");
            Console.WriteLine("2. EDIT PARAMS");
            Console.WriteLine("3. DEL PARAMS");
            Console.WriteLine("4. CHEAT MODE");
            Console.WriteLine("5. CHANGE SECRET CODE");
            Console.WriteLine("0. EXIT DEVELOPER MODE");
            Console.WriteLine();
            Console.Write("CHOICE: ");
        }
        #endregion

        #region MAIN
        public static void Main(string[] args)
        {

            #region VARIABILI            
            // *DICHIARAZIONE VARIABILI*
            int scelta = 0, nn = 0, n = 0, num = 0, ra2 = 0, z = 0, xyz = 0, SECRET_CODE = 0;
            uint n1 = 0, num1 = 0;
            double pot = 0, ba = 0, esp = 0, pot1 = 0, ba1 = 0, esp1 = 0;
            double a = 0, b = 0, c = 0, d = 0, e = 0, r = 0, r1 = 0, ra = 0, x = 0, y = 0, sc = 0, bs = 0, tot = 0, tot2 = 0;
            ArrayList Fattoriale = new ArrayList();
            string msg = "";
            // VerificaNumero("");
            #endregion

            #region MENU
            // *MENU*
            do
            {
                Menu();
                Console.Write("CHOICE: ");

                #region TEST
                /* *TEST* 
                 VerificaNumero(Console.ReadLine());
                 bool con = false;
                 string tmpVal = Console.ReadLine();
                 con = verificaNumero(tmpVal);
                 if (con == true) {
                     scelta = int.Parse(Console.ReadLine());
                 } else {

                 }*/
                #endregion

                #region SCELTA
                string sceltaStringa = "";
                sceltaStringa = Console.ReadLine();
                scelta = VerificaNumero(sceltaStringa);
                // scelta = VerificaNumero(Console.ReadLine()); 
                // int.Parse(Console.ReadLine());
                Console.WriteLine("\n");
                #endregion

                #region SCELTA ERRATA
                // *GESTIONE SCELTA ERRATA*
                for (int ABC = 0; scelta != 1 && scelta != 2 && scelta != 3 && scelta != 4 && scelta != 5 && scelta != 6 && scelta != 7 && scelta != 8 && scelta != 9 && scelta != 10 && scelta != 0 && scelta != 05121999; ABC++)
                {
                    Console.Clear();
                    Console.WriteLine("ENTER A VALID CHOICE. \n\n");
                    Menu();
                    Console.Write("CHOICE: ");
                    sceltaStringa = Console.ReadLine();
                    scelta = VerificaNumero(sceltaStringa);
                    // scelta = int.Parse(Console.ReadLine());
                    Console.WriteLine("\n");
                }
                #endregion

                #region SWITCH
                // *GESTIONE SCELTE*
                switch (scelta)
                {
                    #region SCELTA 1
                    case 1: // *SCELTA 1 = ADDIZIONE*
                        Console.Clear();
                        double r2 = 0;
                        Console.Write("ENTER THE NUMBER OF ELEMENTS TO BE ADDED: ");
                        sceltaStringa = Console.ReadLine();
                        nn = VerificaNumero2(sceltaStringa);
                        // nn = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        for (int i = 0; i < nn; i++)
                        {
                            Console.Write($"ENTER ELEMENT NUMBER {i}: ");
                            sceltaStringa = Console.ReadLine();
                            a = VerificaNumero2(sceltaStringa);
                            // a = int.Parse(Console.ReadLine());
                            Console.WriteLine("\n");
                            r2 += a;
                        }
                        Console.WriteLine("\nTHE SUM OF THE NUMBERS IS: {0}", r2);
                        break;
                    #endregion

                    #region SCELTA 2
                    case 2: // *SCELTA 2 = SOTTRAZIONE*
                        Console.Clear();
                        Console.Write("ENTER THE NUMBER OF ELEMENTS TO TAKE: ");
                        sceltaStringa = Console.ReadLine();
                        nn = VerificaNumero2(sceltaStringa);
                        // nn = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        for (int i = 0; i < nn; i++)
                        {
                            Console.Write($"ENTER ELEMENT NUMBER {i}: ");
                            sceltaStringa = Console.ReadLine();
                            a = VerificaNumero2(sceltaStringa);
                            // a = int.Parse(Console.ReadLine());
                            Console.WriteLine("\n");
                            if (i == 0)
                            {
                                r = a;
                            }
                            else
                            {
                                r -= a;
                            }
                        }
                        Console.WriteLine("\nSUBTRACTION OF THE NUMBERS IS: {0}", r);
                        break;
                    #endregion

                    #region SCELTA 3
                    case 3: // *SCELTA 3 = MOLTIPLICAZIONE*
                        Console.Clear();
                        Console.Write("ENTER THE NUMBER OF ELEMENTS TO MULTIPLY: ");
                        sceltaStringa = Console.ReadLine();
                        nn = VerificaNumero2(sceltaStringa);
                        // nn = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        for (int i = 0; i < nn; i++)
                        {
                            Console.Write($"ENTER ELEMENT NUMBER {i}: ");
                            sceltaStringa = Console.ReadLine();
                            a = VerificaNumero2(sceltaStringa);
                            // a = int.Parse(Console.ReadLine());
                            Console.WriteLine("\n");
                            if (i == 0)
                            {
                                r = a;
                            }
                            else
                            {
                                r *= a;
                            }
                        }
                        Console.WriteLine("\nMULTIPLICATION OF NUMBERS IS: {0}", r);
                        break;
                    #endregion

                    #region SCELTA 4
                    case 4: // *SCELTA 4 = DIVISIONE*
                        Console.Clear();
                        Console.Write("ENTER DIVIDEND: ");
                        sceltaStringa = Console.ReadLine();
                        a = VerificaNumero2(sceltaStringa);
                        // a = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        Console.Write("ENTER DIVIDER: ");
                        sceltaStringa = Console.ReadLine();
                        b = VerificaNumero2(sceltaStringa);
                        // b = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        for (int i = 0; b == 0; i++)
                        {
                            Console.WriteLine("IT'S NOT POSSIBLE TO DIVIDE A NUMBER PER ZERO. ENTER ANOTHER ISSUE. \n");
                            Console.Write("ENTER DIVIDER: ");
                            sceltaStringa = Console.ReadLine();
                            b = VerificaNumero2(sceltaStringa);
                            // b = double.Parse(Console.ReadLine());
                            Console.WriteLine("\n");
                        }
                        x = a / b;
                        y = a % b;
                        Console.Write("THE QUOTIENT IS: {0}", x);
                        Console.WriteLine("\n");
                        Console.Write("THE REST IS: {0}", y);
                        do
                        {
                            Console.WriteLine("\n\nTO CONTINUE THE OPERATION ENTER 1. OTHERWISE ENTER 0.");
                            Console.Write("CHOICE: ");
                            sceltaStringa = Console.ReadLine();
                            z = VerificaNumero2(sceltaStringa);
                            // z = int.Parse(Console.ReadLine());
                            Console.WriteLine("\n");
                            for (int i = 0; z != 1 && z != 0; i++)
                            {
                                Console.WriteLine("ERROR! INVALID CHOICE. ENTER ANOTHER CHOICE. ");
                                Console.Write("CHOICE: ");
                                sceltaStringa = Console.ReadLine();
                                z = VerificaNumero2(sceltaStringa);
                                // z = int.Parse(Console.ReadLine());
                                Console.WriteLine("\n");
                            }
                            if (z == 1)
                            {
                                c = x;
                                Console.Write("ENTER DIVIDER: ");
                                sceltaStringa = Console.ReadLine();
                                a = VerificaNumero2(sceltaStringa);
                                // a = double.Parse(Console.ReadLine());
                                Console.WriteLine("\n");
                                for (int i = 0; a == 0; i++)
                                {
                                    Console.WriteLine("IT'S NOT POSSIBLE TO DIVIDE A NUMBER PER ZERO. ENTER ANOTHER ISSUE. \n");
                                    Console.Write("ENTER DIVIDER: ");
                                    sceltaStringa = Console.ReadLine();
                                    a = VerificaNumero2(sceltaStringa);
                                    // a = double.Parse(Console.ReadLine());
                                    Console.WriteLine("\n");
                                }
                                x = c / a;
                                y = c % a;
                                Console.Write("THE QUOTIENT IS: {0}", x);
                                Console.WriteLine("\n");
                                Console.Write("THE REST IS: {0}", y);
                                Console.WriteLine("\n");
                            }
                            else
                            {
                                if (z == 0)
                                {
                                    Console.WriteLine("YOU HAVE CHOSEN TO TERMINATE THE OPERATION. ");
                                }
                            }
                        }
                        while (z == 1 && z != 0);
                        break;
                    #endregion

                    #region SCELTA 5
                    case 5: // *SCELTA 5 = RADICE QUADRATA*
                        Console.Clear();
                        Console.Write("ENTER THE NUMBER TO PROCESS: ");
                        sceltaStringa = Console.ReadLine();
                        ra = VerificaNumero2(sceltaStringa);
                        // ra = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        y = 0;
                        msg = "THE SQUARE ROUND IS: ";
                        for (x = 1; y != ra;)
                        {
                            x++;
                            y = x * x;
                            if (y > ra)
                            {
                                msg = "THE INPUT NUMBER IS NOT A PERFECT SQUARE ROUND. THE APPROXIMATE SQUARE ROUND IS: "; //Console.WriteLine($"THE INPUT NUMBER IS NOT A PERFECT SQUARE ROUND. THE APPROXIMATE SQUARE ROUND IS: {x-1}");
                                x -= 1;
                                break;
                            }
                        }
                        Console.WriteLine(msg + "{0}", x);
                        break;
                    #endregion

                    #region SCELTA 6
                    case 6: // *SCELTA 6 = POTENZA*
                        Console.Clear();
                        Console.Write("ENTER THE BASE: ");
                        sceltaStringa = Console.ReadLine();
                        ba = VerificaNumero2(sceltaStringa);
                        // ba = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        Console.Write("ENTER THE EXPONENT: ");
                        sceltaStringa = Console.ReadLine();
                        esp = VerificaNumero2(sceltaStringa);
                        // esp = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        pot = ba;
                        for (int i = 0; i < esp; i++)
                        {
                            pot *= ba;
                        }
                        pot /= ba;
                        Console.WriteLine("THE EXPONENTIATION IS: {0}", pot);
                        break;
                    #endregion

                    #region SCELTA 7
                    case 7: // *SCELTA 7 = FATTORIALE*
                        Console.Clear();
                        Console.Write("ENTER THE FACTORIAL BASE: ");
                        sceltaStringa = Console.ReadLine();
                        num1 = VerificaNumero3(sceltaStringa);
                        // num = Convert.ToInt32(Console.ReadLine());
                        n1 = num1;
                        Console.WriteLine("\n");
                        for (uint i = 0; num1 == 0; i++)
                        {
                            Console.WriteLine("ERROR! IT'S NOT POSSIBLE TO CALCULATE THE FACTORIAL OF A LOWER NUMBER OF 1. ENTER ANOTHER ISSUE. ");
                            Console.Write("ENTER THE FACTORIAL BASE: ");
                            sceltaStringa = Console.ReadLine();
                            num1 = VerificaNumero3(sceltaStringa);
                            // num = Convert.ToInt32(Console.ReadLine());
                            n1 = num1;
                            Console.WriteLine("\n");
                        }
                        while (num1 > 0)
                        {
                            n1 = num1;
                            for (uint i = n1 - 1; i > 0; i--)
                            {
                                n1 *= i;
                            }
                            Console.WriteLine("FACTORIAL OF {0}! = {1}\n", num1, n1);
                            num1--;
                        }
                        break;
                    #endregion

                    #region SCELTA 8
                    case 8: // *SCELTA 8 = TETRAZIONE*
                        Console.Clear();
                        Console.Write("ENTER THE BASE: ");
                        sceltaStringa = Console.ReadLine();
                        ba1 = VerificaNumero2(sceltaStringa);
                        // ba1 = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        Console.Write("ENTER THE NUMBER OF EXPONENTIATIONS TO BE MADE: ");
                        sceltaStringa = Console.ReadLine();
                        nn = VerificaNumero2(sceltaStringa);
                        // nn = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        Console.Write("ENTER THE EXPONENT: ");
                        sceltaStringa = Console.ReadLine();
                        esp1 = VerificaNumero2(sceltaStringa);
                        // esp1 = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        for (int i = 0; i < nn; i++)
                        {
                            pot1 = ba1;
                            for (int j = 0; j < esp1; j++)
                            {
                                for (int k = 0; k < nn; k++)
                                {
                                    pot1 *= ba1;
                                }
                            }
                            pot1 /= ba1;
                        }
                        Console.WriteLine("TETRACTION IS: {0}", pot1);
                        break;
                    #endregion

                    #region SCELTA 9
                    case 9: // *SCELTA 9 = RADICE CUBICA*
                        Console.Clear();
                        Console.Write("ENTER THE NUMBER TO PROCESS: ");
                        sceltaStringa = Console.ReadLine();
                        ra2 = VerificaNumero2(sceltaStringa);
                        // ra2 = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                        y = 0;
                        msg = "THE CUBIC ROOT IS: ";
                        for (x = 0; y != ra2;)
                        {
                            x++;
                            y = x * x * x;
                            if (y > ra2)
                            {
                                msg = "THE INPUT NUMBER IS NOT A PERFECT CUBIC ROOT. THE APPROXIMATE CUBIC ROOT IS: "; //Console.WriteLine($"La cifra inserita non è un cubo perfetto. La radice cubica approssimata della base inserita è: {x-1}");
                                x -= 1;
                                break;
                            }
                        }
                        Console.WriteLine(msg + "{0}", x);
                        break;
                    #endregion

                    #region SCELTA 10
                    case 10: // *SCELTA 10 = PERCENTUALE*
                        Console.Clear();
                        Console.Write("ENTER THE BASE OF THE PERCENTAGE: ");
                        sceltaStringa = Console.ReadLine();
                        bs = VerificaNumero2(sceltaStringa);
                        Console.WriteLine("\n");
                        Console.Write("ENTER THE PERCENTAGE TO CALCULATE: ");
                        sceltaStringa = Console.ReadLine();
                        sc = VerificaNumero2(sceltaStringa);
                        Console.WriteLine("\n");
                        tot = (bs * sc) / 100;
                        tot2 = bs - tot;
                        Console.Write($"{sc}% OF {bs} IS: {tot}");
                        Console.WriteLine("\n");
                        Console.WriteLine($"THE REST OF THE PERCENTAGE IS: {tot2}");
                        break;
                    #endregion

                    #region DEVELOPER
                    case 05121999: // *DEVELOPER MODE*
                        Console.Clear();
                        Console.Write("YOU HAVE ENTERED DEVELOPER MODE... " +
                                      "PLEASE ENTER THE SECRET CODE TO CONTINUE: ");
                        sceltaStringa = Console.ReadLine();
                        SECRET_CODE = VERIFICA_SECRET_CODE(sceltaStringa);
                        Console.WriteLine("\n");
                        for (int i = 0; SECRET_CODE != 05121999; i++)
                        {
                            Console.WriteLine("WRONG CODE!");
                            Console.Write("ENTER THE SECRET CODE: ");
                            sceltaStringa = Console.ReadLine();
                            SECRET_CODE = VERIFICA_SECRET_CODE(sceltaStringa);
                            Console.WriteLine("\n");
                        }
                        if (SECRET_CODE == 05121999)
                        {
                            int choice = 0, second_choice = 0, new_code = 0, new_code_2 = 0;
                            Console.WriteLine(" PASSWORD ACCEPTED...");

                            /* *TIMER TEST*
                            Console.WriteLine("\n");
                            Console.WriteLine("PLEASE WAIT...");
                            Timer.Tick += TimerEventProcessor;
                            Timer.Interval = 5000;
                            Timer.Start();
                            SetTimer();
                            aTimer.Elapsed += Elapsed;
                            aTimer.Start();
                            */

                            Console.Write("\n\n PRESS ANY KEY TO CONTINUE...");
                            Console.ReadLine();
                            do
                            {
                                Console.Clear();
                                Console.WriteLine("CHOOSE AN OPTION: ");
                                Console.WriteLine();
                                Console.WriteLine("1. ADD PARAMS");
                                Console.WriteLine("2. EDIT PARAMS");
                                Console.WriteLine("3. DEL PARAMS");
                                Console.WriteLine("4. CHEAT MODE");
                                Console.WriteLine("5. CHANGE SECRET CODE");
                                Console.WriteLine("0. EXIT DEVELOPER MODE");
                                Console.WriteLine("\n");
                                Console.Write("CHOICE: ");
                                sceltaStringa = Console.ReadLine();
                                choice = VERIFICA_CHOICE(sceltaStringa);
                                Console.WriteLine("\n");
                                for (int i = 0; choice != 1 && choice != 2 && choice != 3 && choice != 4 && choice != 5 && choice != 0; i++)
                                {
                                    Console.Clear();
                                    Console.WriteLine("ENTER A CORRECT CHOICE! \n\n");
                                    Console.WriteLine("CHOOSE AN OPTION: ");
                                    Console.WriteLine();
                                    Console.WriteLine("1. ADD PARAMS");
                                    Console.WriteLine("2. EDIT PARAMS");
                                    Console.WriteLine("3. DEL PARAMS");
                                    Console.WriteLine("4. CHEAT MODE");
                                    Console.WriteLine("5. CHANGE SECRET CODE");
                                    Console.WriteLine("0. EXIT DEVELOPER MODE");
                                    Console.WriteLine();
                                    Console.Write("CHOICE: ");
                                    sceltaStringa = Console.ReadLine();
                                    choice = VERIFICA_CHOICE(sceltaStringa);
                                    Console.WriteLine("\n");
                                }
                                switch (choice)
                                {
                                    case 1:

                                        break;

                                    case 2:

                                        break;

                                    case 3:

                                        break;

                                    case 4:

                                        break;

                                    case 5:
                                        Console.Clear();
                                        Console.Write("ENTER THE CURRENT SECRET CODE: ");
                                        sceltaStringa = Console.ReadLine();
                                        second_choice = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                        Console.WriteLine("\n");
                                        if (second_choice == SECRET_CODE)
                                        {
                                            Console.Write("ENTER THE NEW SECRET CODE: ");
                                            sceltaStringa = Console.ReadLine();
                                            new_code = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                            Console.WriteLine("\n");
                                            Console.Write("REPEAT THE NEW SECRET CODE: ");
                                            sceltaStringa = Console.ReadLine();
                                            new_code_2 = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                            Console.WriteLine("\n");
                                            if (new_code == new_code_2)
                                            {
                                                Console.Write($"SECRET CODE UPDATED. THE NEW SECRET CODE IS: <{new_code}>");
                                                SECRET_CODE = new_code;
                                                Console.WriteLine("\n\nNOW YOU WILL RETURN TO THE PROGRAM'S HOME PAGE... ");
                                                Console.WriteLine("\nPRESS ANY KEY TO CONTINUE... ");
                                                Console.ReadLine();
                                                break;
                                            }
                                            else
                                            {
                                                for (int j = 0; new_code != new_code_2; j++)
                                                {
                                                    Console.WriteLine("\nERROR! THE TWO CODES ARE DIFFERENT! ENTER IN THE FIELD THE SAME CODE OF THE FIRST. ");
                                                    Console.Write("ENTER THE NEW SECRET CODE: ");
                                                    sceltaStringa = Console.ReadLine();
                                                    new_code = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                                    Console.WriteLine("\n");
                                                    Console.Write("REPEAT THE NEW SECRET CODE: ");
                                                    sceltaStringa = Console.ReadLine();
                                                    new_code_2 = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                                    Console.WriteLine("\n");
                                                }
                                            }
                                        }
                                        else
                                        {
                                            for (int f = 0; second_choice != SECRET_CODE; f++)
                                            {
                                                Console.WriteLine("\nERROR! WRONG CODE! ENTER THE CORRECT CURRENT SECRET CODE. ");
                                                Console.Write("ENTER THE CURRENT SECRET CODE: ");
                                                sceltaStringa = Console.ReadLine();
                                                second_choice = VERIFICA_SECRET_CODE_2(sceltaStringa);
                                                Console.WriteLine("\n");
                                            }
                                        }
                                        break;
                                }
                            } while (choice != 0);
                            Console.Clear();
                            Console.WriteLine(" YOU HAVE LEFT THE DEVELOPER MODE...");
                            Console.WriteLine("\n");
                            Console.Write(" PRESS ANY KEY TO CONTINUE...");
                        }
                        break;
                    #endregion

                    #region SCELTA 0
                    case 0: // *SCELTA 0 = EXIT*
                        Console.Clear();
                        Console.WriteLine("\nYOU HAVE CHOSEN TO TERMINATE THE PROGRAM. ");
                        break;
                    #endregion

                    #region SCELTA DEFAULT
                    default:
                        Console.Clear();
                        Console.WriteLine("IMPOSSIBLE! ");
                        break;
                    #endregion
                }
                #endregion
                Console.ReadLine();
                Console.Clear();
            }
            while (scelta != 0);
            #endregion
        }
        #endregion
    }
    #endregion
}
#endregion

#region TESTS
/* *TEST DECIMAL*
 
// 6.1283738070791493602393614220176664011587311950256367795624200686294530200719566092674689125517947158833789... × 10^1355310569403873 
 */



/*  *TEST COSTANTI*
                       
                        private const int A = 1;
                        private const int B = 2;
                        private const int C = 3;
                        private const int D = 4;
                        private const int E = 5;
                        private const int F = 6;
                        private const int G = 7;
                        private const int H = 8;
                        private const int I = 9;
                        private const int L = 0;
 */



/*  *TEST FATTORIALE*
                       
                    Console.WriteLine("Inserire la base del fattoriale: ");
                    d = double.Parse(Console.ReadLine());
                    Fattoriale.Add(d);
                    for (int i = 0; i < d; i++)
                    {
                        Fattoriale.Add(d - 1);
                    }
                    Console.WriteLine("\n");
                    for (int i = 0;  d < 1; i++)
                    {
                        Console.WriteLine("Il fattoriale può essere applicato solo a numeri positivi. Inserire un altro numero. \n");
                        Console.WriteLine("Inserire la base del fattoriale: ");
                        d = double.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                    }
                    if (d == 1)
                    {
                        Console.WriteLine($"Il fattoriale del numero inserito è: ", d);
                        Console.WriteLine("\n");
                    }
                    for (int k = 0; k < d; k++) 
                    {
                        e = Fattoriale[d] * Fattoriale[k];
                    }
                    Console.WriteLine($"Il fattoriale del numero inserito è: ", d);
                    Console.WriteLine("\n"); 
*/



/*  *TEST DIVISIONE*  
  
            Console.WriteLine("Inserire il numero di elementi da dividere: ");
            nn = int.Parse(Console.ReadLine());
            Console.WriteLine("\n");
            if ((nn / 2) == 0)
            {
                for (int i = 0; i < (nn / 2); i++)
                {
                    Console.WriteLine("Inserire divisore: ");
                    a = int.Parse(Console.ReadLine());
                    Console.WriteLine("\n");
                    Console.WriteLine("Inserire divisore: ");
                    b = int.Parse(Console.ReadLine());
                    Console.WriteLine("\n");
                    for (int j = 0; b == 0; j++)
                    {
                        Console.WriteLine("Non puoi dividere un numero per zero. Inserire un altro numero. \n");
                        Console.WriteLine("Inserire il divisore: ");
                        b = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                    }
                    if (i == 0)
                    {
                        r = a;
                    }
                    else
                    {
                        r /= b;
                    }
                }
            }
            else
            {
                for (int i = 0; i < ((nn / 2) + 1); i++)
                {
                    Console.WriteLine("Inserire divisore: ");
                    a = int.Parse(Console.ReadLine());
                    Console.WriteLine("\n");
                    Console.WriteLine("Inserire divisore: ");
                    b = int.Parse(Console.ReadLine());
                    Console.WriteLine("\n");
                    for (int j = 0; b == 0; j++)
                    {
                        Console.WriteLine("Non puoi dividere un numero per zero. Inserisci un altro numero. \n");
                        Console.WriteLine("Inserisci il divisore: ");
                        b = int.Parse(Console.ReadLine());
                        Console.WriteLine("\n");
                    }
                    if (i == 0)
                    {
                        r = a;
                    }
                    else
                    {
                        r /= b;
                    }
                }
            }
*/



/*    *TEST METODO*
         public static bool verificaNumero(string valoreDaControllare) {
            int a = 0;
            int numero = 0;
            do {

                try {
                    numero = int.Parse(Console.ReadLine());
                    return true;
                } catch (FormatException) {
                    return false;
                }

            } while (a != 1);
        }
*/
#endregion
 
Ultima modifica:

Krona

Nuovo Utente
69
36
Un paio di consigli per la leggibilità:
  1. Non usare region ovunque, leggiti le best practice per l'uso
  2. Non usare commenti in formato /**/, prediligi /// usato con autocompletamento per la documentazione su Visual Studio (e altri IDE) e comandi per commentare/decommentare automaticamente blocchi
  3. Non usare l'italiano, al massimo è concesso nei commenti.
  4. Non usare "_" per i nomi delle variabili
Il che è tutto riassumibile con l'unico consiglio di usare le linee guida delle convenzioni Microsoft per la scrittura di codice. (link)
 
  • Mi piace
Reazioni: TheLastViper

TheLastViper

Nuovo Utente
8
2
CPU
Intel core i5 - 4590
Scheda Madre
ASUS H81I-PLUS
HDD
SSD 120/128 GB SATA
RAM
DDR3-1600 DIMM 8GB
GPU
KFA Geforce GTX 1060 OC
Audio
Logitech 5.1 Sound system 75W
Monitor
24"(60.9 cm) Full HD monitor gaming
Periferiche
Wireless keyboard with touchpad + Logitech G29 steering wheel/pedal set
Net
Fastweb ADSL2+ 20Mb
OS
Windows 10
Un paio di consigli per la leggibilità:
  1. Non usare region ovunque, leggiti le best practice per l'uso
  2. Non usare commenti in formato /**/, prediligi /// usato con autocompletamento per la documentazione su Visual Studio (e altri IDE) e comandi per commentare/decommentare automaticamente blocchi
  3. Non usare l'italiano, al massimo è concesso nei commenti.
  4. Non usare "_" per i nomi delle variabili
Il che è tutto riassumibile con l'unico consiglio di usare le linee guida delle convenzioni Microsoft per la scrittura di codice. (link)

Grazie mille! Queste sono cose che di solito correggo una volta terminato il programma, in fase di creazione lascio un po tutto "come viene" per fare prima nello sviluppo del codice. Però hai ragione, sono sicuramente cose da sistemare, grazie per i consigli ;)
Post unito automaticamente:

UPDATE: Tutto il testo degli output è stato convertito in inglese
 
Ultima modifica:
  • Mi piace
Reazioni: Krona

Andretti60

Utente Èlite
6,440
5,091
Benvenuto. Prendi i miei commenti come critiche costruttive.

Prima di tutto, NO. Non hai scritto un programma in C#. O almeno, hai scritto un programma con il classico paradigma procedurale, usando il linguaggio di programmazione C#, ma tale linguaggio e' pensato per usare paradigmi di programmazione tipicamente OOP. Se vuoi usare veramente bene il C# (premetto e' adesso il linguaggio che uso principalmente al lavoro) Devi imparare a "pensare" in OOP. Per esempio, hai scritto tutto in una grande funzione (Program) che in OOP e' un "no-no", con tanti metodi statici. Devi scordarti di pensare in maniera procedurale, e pensare alle operazioni da fare come metodi di classi, e devi pensare in termine di interfacce.

Nel tuo caso, hai delle operazioni da fare, quindi ha senso definire una interfaccia Operazione, da cui derivare una classe per ogni operazione che vuoi effettuare. Ogni classe sara' responsabile di esporre mediante metodi e proprieta' il suo Nome (per esempio "somma"), e quanti operandi abbia bisogno, fare il controllo degli operandi (per esempio la divisione ritornera' errore se si passa zero come divisore), e ovviamente il metodo Calcola che effettuera' l'operazione richiesta. Crea una classe per ogni operazione, e mettile in una collezione, usando per esempio la proprieta' Nome come chiave. A questo punto il Menu sara' semplicemente una iterazione delle classi nella collezione, stampando il nome di ciascuna di esse. Leggera' gli operandi (quanti ne sono richiesti), li passera' alla classe prescelta e li passera' alla classe e stampera' il risultato. Semplice, nessun bisogno di istruzioni switch che richiedono sempre aggiunte nel caso si aggiunga dell'altro. Puoi togliere e aggiungere quanti classi vuoi, senza dovere MAI modificare il programma principale, che dovra' essere quindi il piu' "ignorante" possibile sulle operazioni interne di ogni singola classe.
Non solo, avendo spezzato il programma in classi, le potrai poi usare in altri programmi, magari aggiundo una interfaccia grafica: a quel punto potrai quindi pensare SOLO alla grafica, facendola interessante piu' che vuoi, senza dovere pensare ai dettagli delle operazioni.

Capisco che e' un bel cambio di ragionamento, ma senza di quello continerai a usare il C# come se fosse semplicemente il C, a quel punto tanto vale rimanere con il C.

Il tuo codice e' comunque confuso (premetto che non lo provato) hai un sacco di metodi tipo VerificaNumeroTremilaDuemila (la cui differenza e' oscura), e un sacco di codice commentato. Quando pubblichi il tuo codice (e grazie per avere usato il TAG apposito) per favore "pulisci" il codice e pubblica solo quello che interessa.

Un paio di consigli per la leggibilità:
  1. Non usare region ovunque, leggiti le best practice per l'uso
  2. Non usare commenti in formato /**/, prediligi /// usato con autocompletamento per la documentazione su Visual Studio (e altri IDE) e comandi per commentare/decommentare automaticamente blocchi
  3. Non usare l'italiano, al massimo è concesso nei commenti.
  4. Non usare "_" per i nomi delle variabili
Il che è tutto riassumibile con l'unico consiglio di usare le linee guida delle convenzioni Microsoft per la scrittura di codice. (link)
  1. A me invece i region piacciono parecchio, permettono di isolare le parti del codice su cui si sta lavorando (se si usa un IDE in grado di comprimerli)
  2. I commenti vanno bene in qualunque formato, sono commenti (a meno che non si lavori in un ambiente che richieda un particolare formalismo)
  3. L'italiano quando si sta studiando va benissimo. Poi magari si trovera' lavoro in Francia o Germania e allora tocchera' studiare e usare un'altra lingua. Piuttosto i nomi delle variabili devono essere sensati, ho scritto una guida a riguardo, si trova nelle lista in rilievo.
  4. Sull'uso del carattere underscore _, ci sono scuole di pensiero diverse. Ci sono quelli a cui non piace perche' si deve premere lo Shift per digitarlo, altri lo usano come primo caratteri dei parametri di classe, altri lo usano solo nei nomi delle variabili e non nei nomi dei metodi e cosi' via. Non c'e nulla di male nell'usarlo, basta essere consistenti.
  5. Le regole Microsoft fanno ridere, vai a vedere il codice scritto da loro stessi e non le usa nessuno :) Ogni azienda ha le sue convenzioni, come ho accennato prima. Quando si lavoro da soli occorre crearsi le proprie regole, ma essere flessibili nel poterle cambiare in futuro.
 

TheLastViper

Nuovo Utente
8
2
CPU
Intel core i5 - 4590
Scheda Madre
ASUS H81I-PLUS
HDD
SSD 120/128 GB SATA
RAM
DDR3-1600 DIMM 8GB
GPU
KFA Geforce GTX 1060 OC
Audio
Logitech 5.1 Sound system 75W
Monitor
24"(60.9 cm) Full HD monitor gaming
Periferiche
Wireless keyboard with touchpad + Logitech G29 steering wheel/pedal set
Net
Fastweb ADSL2+ 20Mb
OS
Windows 10
Benvenuto. Prendi i miei commenti come critiche costruttive.

Prima di tutto, NO. Non hai scritto un programma in C#. O almeno, hai scritto un programma con il classico paradigma procedurale, usando il linguaggio di programmazione C#, ma tale linguaggio e' pensato per usare paradigmi di programmazione tipicamente OOP. Se vuoi usare veramente bene il C# (premetto e' adesso il linguaggio che uso principalmente al lavoro) Devi imparare a "pensare" in OOP. Per esempio, hai scritto tutto in una grande funzione (Program) che in OOP e' un "no-no", con tanti metodi statici. Devi scordarti di pensare in maniera procedurale, e pensare alle operazioni da fare come metodi di classi, e devi pensare in termine di interfacce.

Nel tuo caso, hai delle operazioni da fare, quindi ha senso definire una interfaccia Operazione, da cui derivare una classe per ogni operazione che vuoi effettuare. Ogni classe sara' responsabile di esporre mediante metodi e proprieta' il suo Nome (per esempio "somma"), e quanti operandi abbia bisogno, fare il controllo degli operandi (per esempio la divisione ritornera' errore se si passa zero come divisore), e ovviamente il metodo Calcola che effettuera' l'operazione richiesta. Crea una classe per ogni operazione, e mettile in una collezione, usando per esempio la proprieta' Nome come chiave. A questo punto il Menu sara' semplicemente una iterazione delle classi nella collezione, stampando il nome di ciascuna di esse. Leggera' gli operandi (quanti ne sono richiesti), li passera' alla classe prescelta e li passera' alla classe e stampera' il risultato. Semplice, nessun bisogno di istruzioni switch che richiedono sempre aggiunte nel caso si aggiunga dell'altro. Puoi togliere e aggiungere quanti classi vuoi, senza dovere MAI modificare il programma principale, che dovra' essere quindi il piu' "ignorante" possibile sulle operazioni interne di ogni singola classe.
Non solo, avendo spezzato il programma in classi, le potrai poi usare in altri programmi, magari aggiundo una interfaccia grafica: a quel punto potrai quindi pensare SOLO alla grafica, facendola interessante piu' che vuoi, senza dovere pensare ai dettagli delle operazioni.

Capisco che e' un bel cambio di ragionamento, ma senza di quello continerai a usare il C# come se fosse semplicemente il C, a quel punto tanto vale rimanere con il C.

Il tuo codice e' comunque confuso (premetto che non lo provato) hai un sacco di metodi tipo VerificaNumeroTremilaDuemila (la cui differenza e' oscura), e un sacco di codice commentato. Quando pubblichi il tuo codice (e grazie per avere usato il TAG apposito) per favore "pulisci" il codice e pubblica solo quello che interessa.

Grazie per i tuoi consigli, sono sicuramente stati apprezzati, fidati ;)

Innanzitutto mi scuso per il disordine nel codice, in fase di sviluppo, per seguire il ragionamento che sto facendo, molto spesso aggiungo variabili e strutture rapidamente, senza badare a come sono scritte, in quel momento mi interessa capire se il ragionamento è corretto, se a livello logico il programma o quella parte di codice può funzionare o meno. Una volta che il mio programma sarà completato sarò il primo a riordinare il tutto, odio come te quel caos confusionario quindi commenti, variabili e metodi saranno tutti riorganizzati in maniera più pulita ;)

In secondo aspetto, so che hai ragione sul modo in cui devo abituarmi a pensare, finora ho sempre programmato in C++ (linguaggio che adoro personalmente) e la logica che richiedeva era molto più lineare, senza bisogno di creare classi, oggetti e metodi. Questi concetti mi sono nuovi, veramente, sto avendo molta difficoltà ad afferrarli e ad abituarmi a questo nuovo tipo di programmazione, perciò mi scuso se non è così che andava fatto, ma non mi viene proprio istintivo pensare di creare un'altra classe da richiamare poi nel main e di spezzettare così il codice.. Davvero non sono abituato a questa logica.. Ho 19 anni e, avendo alle spalle solo la mia esperienza personale di studio individuale (anche parecchio approfondito grazie a dei manuali molto seri) del C++ nell'ambito della programmazione, e stando attualmente studiando da solo per lavoro il C# sto trovando fatica in questo.

Grazie davvero ancora per l'aiuto, lo apprezzo, se hai altri suggerimenti da darmi magari per aiutarmi a comprendere meglio questo tipo di logica per la programmazione object oriented davvero te ne sarei molto grato :)
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Mi intrufolo rapidamente: benvenuto in primis.

Poi una precisazione: è vero che C++ lo si può utilizzare anche senza OOP, ma rimane un linguaggio OOP (per altro ha pure il supporto all'ereditarietà multipla); per altro anche complesso rispetto considerando la quantità di funzionalità e la vastità dell'API.
Sino a dove hai visto C++?

A me aiutava molto pensare a cosa dovevo rappresentare, e ragionare in termini di classi e interfacce (intesi in questo caso come i metodi della classe, che forniscono un accesso ai dati, ovvero le variabili) rendeva tutto logico. Ogni cosa che devi rappresentare la puoi rappresentare sotto il concetto di classe, fatto salvo per quelle classi di "utilità" (di solito la classe che si occupa di calcoli vari, come seno, coseno, potenze è una di queste) che hanno funzioni generali e che vengono dichiarate static così da poterle richiamare senza oggetti a disposizione.

Spero di essere stato un minimo chiaro; devo scappare a lavoro, ho risposto un po' di fretta.
 
  • Mi piace
Reazioni: TheLastViper

TheLastViper

Nuovo Utente
8
2
CPU
Intel core i5 - 4590
Scheda Madre
ASUS H81I-PLUS
HDD
SSD 120/128 GB SATA
RAM
DDR3-1600 DIMM 8GB
GPU
KFA Geforce GTX 1060 OC
Audio
Logitech 5.1 Sound system 75W
Monitor
24"(60.9 cm) Full HD monitor gaming
Periferiche
Wireless keyboard with touchpad + Logitech G29 steering wheel/pedal set
Net
Fastweb ADSL2+ 20Mb
OS
Windows 10
Mi intrufolo rapidamente: benvenuto in primis.

Poi una precisazione: è vero che C++ lo si può utilizzare anche senza OOP, ma rimane un linguaggio OOP (per altro ha pure il supporto all'ereditarietà multipla); per altro anche complesso rispetto considerando la quantità di funzionalità e la vastità dell'API.
Sino a dove hai visto C++?

A me aiutava molto pensare a cosa dovevo rappresentare, e ragionare in termini di classi e interfacce (intesi in questo caso come i metodi della classe, che forniscono un accesso ai dati, ovvero le variabili) rendeva tutto logico. Ogni cosa che devi rappresentare la puoi rappresentare sotto il concetto di classe, fatto salvo per quelle classi di "utilità" (di solito la classe che si occupa di calcoli vari, come seno, coseno, potenze è una di queste) che hanno funzioni generali e che vengono dichiarate static così da poterle richiamare senza oggetti a disposizione.

Spero di essere stato un minimo chiaro; devo scappare a lavoro, ho risposto un po' di fretta.

Grazie per i consigli innanzitutto. Il C++ l'ho visto in maniera molto approfondita, ho studiato il linguaggio, i principi di programmazione e la libreria standard per intero studiando da guide, siti e un manuale acquistato di 1200 pagine. Il fatto è che semplicemente non ho mai visto la necessità di suddividere il programma in "classi" in C++. Ora, invece, con C# questo bisogno è molto più evidente, soprattutto in ambito lavorativo dato che il C# lo sto studiando solo per lavoro. Perciò per me questi concetti sono abbastanza nuovi. Non so se mi sono spiegato bene.

Quando hai qualche minuto, se ti va, mi piacerebbe molto che potessi aiutarmi a capire bene questi concetti di classi e oggetti (il concetto di metodo lo conosco già invece perché in C++ equivarrebbe alla funzione, quindi so come usare un metodo e di cosa si tratta). Grazie mille :)
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
semplicemente non ho mai visto la necessità di suddividere il programma in "classi" in C++

C++ ti consente di usare il modello procedurale senza problemi. Se il programma da realizzare è pure semplice, si finisce ovviamente per non sfruttare il modello OOP. Che tra l'altro è un tipico figlio del metodo waterfall, cioè si parte dal problema, lo si analizza, si schematizza la soluzione in termini di entità autonome e relazioni tra di essere. Ed è da qui che escono le classi, i metodi e le chiamate tra le classi.

E' tipico della mentalità dell'hacker affrontare direttamente il problema, proponendo una soluzione in codice. E in genere è difficile scrivere codice con classi quando manca tutta la parte di progettazione/pianificazione logica.

Ora, invece, con C# questo bisogno è molto più evidente

Perchè C# ti costringe a ragionare con le classi. Usando il paradigma procedurale, sembra che il linguaggio ti si metta continuamente di traverso.
 

Andretti60

Utente Èlite
6,440
5,091
C++ ti consente di usare il modello procedurale senza problemi. ...
Nel bene e nel male :)
Concordo in tutto quello che dici.
Il problema del C++ e' che e' essenzialmente nato aggiungendo il concetto di "classi" al linguaggio C, e quindi permette all'utente di usarlo semplicemente come il C, senza quindi sfruttarne le potenzialita'. che e' quello che fanno poi molti novellini, dicendo che "conoscono" C++, il che non e' vero. Finche' non ci si "sporca le mani", come si dice nel gergo, e si inizia a pensare in termine di OOP, non si puo' dire di conoscere ne' C++, ne' C# e neanche Java.
Vorrei pero' spezzare una lancia: e' possibile programmare senza necessariamente usare tecniche OOP, dipende molto dal tipo di programmi che si scrive. Ma in genere, molte volte si inizia a scrivere in maniera procedurale (perche' piu' immediata e veloce) per poi accorgersi in seguito, quando occorre modificare e aggiungere nuove opzioni, quanto tempo avremmo poi guadagnato se avessimo cominciato subito a usare metodologie OOP.
Post unito automaticamente:

Grazie per i tuoi consigli, sono sicuramente stati apprezzati, fidati ;)

... perciò mi scuso se non è così che andava fatto, ma non mi viene proprio istintivo pensare di creare un'altra classe da richiamare poi nel main e di spezzettare così il codice.. Davvero non sono abituato a questa logica.. ...

Grazie davvero ancora per l'aiuto, lo apprezzo, se hai altri suggerimenti da darmi magari per aiutarmi a comprendere meglio questo tipo di logica per la programmazione object oriented davvero te ne sarei molto grato :)
Sono contento che hai apprezzato i suggerimenti.

Innanzi tutto non devi scusarti, hai scritto un programma che funziona, in un linguaggio che stai imparando, e' logico che di strada davanti a te ne hai parecchia da fare, si impara a piccoli passi. Ma ti avverto, nel nostro lavoro devi assolutamente imparare a usare metodologie OOP, so che e' difficile all'inizio specie per chi viene da linguaggi procedurali come il C (vedi il sottoscritto). Il metodo procedurale va bene per piccole applicazioni, ma appena il programma prende lo slancio immediatamente diventa un pasticcio di "spaghetti code" (come si dice in inglese).

Purtroppo non so darti consiglio su che testi studiare, ma mi pare che tu ne abbia serio bisogno. Io studiai su dispense universitarie, quando OOP era alla sua infanzia. Probabilmente qualcuno qui ti potra' dare suggerimenti. Cerca un testo che si focalizza sulle tecniche OOP piuttosto che su un singolo linguaggio, evita quindi titoli del tipo "Programmare OOP usando il C# in due settimane" :) ti assicuro, sono inutili. OOP non ha nulla a che vedere con il "programmare", e' un modo di pensare e risolvere problemi, il linguaggio che si usera' poi e' ininfluente, puoi usare quello che preferisci (ormai tutti i linguaggi moderno permettono di usare metodologie OOP)
 
Ultima modifica:
  • Mi piace
Reazioni: TheLastViper

pabloski

Utente Èlite
2,868
916
e' possibile programmare senza necessariamente usare tecniche OOP, dipende molto dal tipo di programmi che si scrive.

Se il linguaggio ti supporta, è il modo migliore di procedere. Penso ad Haskell.

L'OOP ha prodotto danni perchè è stata pompata in maniera incredibile negli anni '90. Sembrava che tutto il mondo potesse essere ricostruito col paradigma OOP. E così si finisce per cadere spesso nella sovraingegnerizzazione.
 

Andretti60

Utente Èlite
6,440
5,091
Se il linguaggio ti supporta, è il modo migliore di procedere. Penso ad Haskell.

L'OOP ha prodotto danni perchè è stata pompata in maniera incredibile negli anni '90. Sembrava che tutto il mondo potesse essere ricostruito col paradigma OOP. E così si finisce per cadere spesso nella sovraingegnerizzazione.
Haskell come tutti i linguaggi ha le sue limitazioni.
Anche sul fatto che OOP sia stato enormemente pompato al suo inizio sono completamente in accordo, fu proprio quello a fare creare il C++, che personalmente penso sia un obbrobbrio di linguaggio, i programmatori volevano continuare a usare il loro amato C ma volevano allo stesso tempo usare paradigmi OOP. OOP non e' un coltellino svizzero che va bene per tutto senza andare bene per nulla, e' un paradigma che come tutti i paradigmi va usato nelle giuste situazioni.
La sovraingegnerizzazione e' comunque tanto pericolosa quanto la sottoingegnerizzazione. Ecco perche' esistono discipline accademiche come scienza dell'informatica e ingneria informatica. Tutti sono capaci di sedersi davani a un computer e scrivere del codice. Pochi quelli capaci di progettare un lavoro che avra' successo e durera' negli anni permettendo uno sviluppo agile e veloce.
 

TheLastViper

Nuovo Utente
8
2
CPU
Intel core i5 - 4590
Scheda Madre
ASUS H81I-PLUS
HDD
SSD 120/128 GB SATA
RAM
DDR3-1600 DIMM 8GB
GPU
KFA Geforce GTX 1060 OC
Audio
Logitech 5.1 Sound system 75W
Monitor
24"(60.9 cm) Full HD monitor gaming
Periferiche
Wireless keyboard with touchpad + Logitech G29 steering wheel/pedal set
Net
Fastweb ADSL2+ 20Mb
OS
Windows 10
C++ ti consente di usare il modello procedurale senza problemi. Se il programma da realizzare è pure semplice, si finisce ovviamente per non sfruttare il modello OOP. Che tra l'altro è un tipico figlio del metodo waterfall, cioè si parte dal problema, lo si analizza, si schematizza la soluzione in termini di entità autonome e relazioni tra di essere. Ed è da qui che escono le classi, i metodi e le chiamate tra le classi.
Esatto, come ha accennato Andretti il C++ non richiede necessariamente di usare usato come OOP, con questo linguaggio è possibile programmare bene anche in maniera procedurale, il che è dovuto al fatto che il C++ non è un linguaggio nuovo, sviluppato da zero, ma è stato preso il C e gli è stata aggiunta la possibilità di poter usare il paradigma Object Oriented. Perciò è possibile scrivere codice proceduralmente come se si stesse programmando in C. Io personalmente ho studiato la parte OOP di C++ ma non l'ho mai messa in pratica perché non ne ho visto, appunto, la necessità.


E' tipico della mentalità dell'hacker affrontare direttamente il problema, proponendo una soluzione in codice. E in genere è difficile scrivere codice con classi quando manca tutta la parte di progettazione/pianificazione logica.
Non so se il tuo riferimento è "casuale" o meno ma io sono effettivamente un hacker infatti il tuo commento mi si addice alla perfezione. Il fatto è che tutta la parte di progettazione non mi è stata proprio mai insegnata, ho finito scuola qualche mese fa e in questi anni (parlando di studio prettamente scolastico, escludendo quelli fatti individualmente) ho visto solo una vaga infarinatura di C++, di Java e di PHP. Il C++ ho poi provveduto ad approfondirlo individualmente, così come il PHP per tutta la parte lato server nello sviluppo di siti web. Come potrai immaginare, con il Java mi sono trovato veramente malissimo, il che mi ha portato un po ad odiare questo linguaggio e un po tutto il paradigma OOP.

Perchè C# ti costringe a ragionare con le classi. Usando il paradigma procedurale, sembra che il linguaggio ti si metta continuamente di traverso.
Esattamente, ed è questo che mi sta obbligando ad approfondire tutta la parte OOP
Post unito automaticamente:

Sono contento che hai apprezzato i suggerimenti.

Innanzi tutto non devi scusarti, hai scritto un programma che funziona, in un linguaggio che stai imparando, e' logico che di strada davanti a te ne hai parecchia da fare, si impara a piccoli passi. Ma ti avverto, nel nostro lavoro devi assolutamente imparare a usare metodologie OOP, so che e' difficile all'inizio specie per chi viene da linguaggi procedurali come il C (vedi il sottoscritto). Il metodo procedurale va bene per piccole applicazioni, ma appena il programma prende lo slancio immediatamente diventa un pasticcio di "spaghetti code" (come si dice in inglese).
Infatti in C++, pur conoscendo le metodologie OOP, non ho mai sentito il bisogno di utilizzarle, come dicevo prima, e ho continuato a programmare in questo linguaggio in maniera procedurale. Studiando ora il C# mi sono accorto che in questo ambiente sono invece strumenti indispensabili, perciò è un bel cambiamento come sicuramente saprai.

Purtroppo non so darti consiglio su che testi studiare, ma mi pare che tu ne abbia serio bisogno. Io studiai su dispense universitarie, quando OOP era alla sua infanzia. Probabilmente qualcuno qui ti potra' dare suggerimenti. Cerca un testo che si focalizza sulle tecniche OOP piuttosto che su un singolo linguaggio, evita quindi titoli del tipo "Programmare OOP usando il C# in due settimane" :) ti assicuro, sono inutili. OOP non ha nulla a che vedere con il "programmare", e' un modo di pensare e risolvere problemi, il linguaggio che si usera' poi e' ininfluente, puoi usare quello che preferisci (ormai tutti i linguaggi moderno permettono di usare metodologie OOP)
Tranquillo, non mi sono mai fatto fregare da questo tipo di testi, i manuali che ho acquistato sono sempre stati validi elementi che partissero dalle basi e che hanno sempre richiesto mesi di studio (sono stati pagati anche un bel po in effetti :hihi:). Per quanto riguarda un manuale dedicato al paradigma OOP piuttosto che ad un linguaggio, devo dire che mi hai dato un'ottima idea, non ci avevo pensato, sicuramente mi documenterò al riguardo. Grazie mille!
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

pabloski

Utente Èlite
2,868
916
Non so se il tuo riferimento è "casuale" o meno ma io sono effettivamente un hacker infatti il tuo commento mi si addice alla perfezione. Il fatto è che tutta la parte di progettazione non mi è stata proprio mai insegnata

Non è un problema insormontabile. Faccio notare che esiste la metodologia Agile che funziona proprio così. Solo che dopo il prototipo, scritto di getto e spesso in maniera non OOP ( o addirittura in altri linguaggi più adatti tipo Python ), si riscrive praticamente tutto daccapo, in maniera più ragionata e con alle spalle la conoscenza di tutti i dettagli fornita dal prototipo.

Il guaio dell'OOP moderno, è di averlo piegato alle necessità di linguaggi "statici". Una sorta di proto-OOP era usato in LISP, dove potevi manipolare a runtime, in maniera dinamica, ogni oggetto del programma e aggiuungergli/togliergli attributi. E il primo linguaggio a diffonderlo ed usarlo massicciamente fu Smalltalk, che pure era un linguaggio fortemente riflessivo ( nel senso della reflection ). Se provi Pharo ( un derivato moderno di Smalltalk ), noterei che è possibile per un hacker usare l'OOP.
 

Andretti60

Utente Èlite
6,440
5,091
Non è un problema insormontabile. Faccio notare che esiste la metodologia Agile che funziona proprio così. Solo che dopo il prototipo, scritto di getto e spesso in maniera non OOP ( o addirittura in altri linguaggi più adatti tipo Python ), si riscrive praticamente tutto daccapo, ...
A meno che si abbia fatto un lavoro cosi' ben fatto che il tuo capo dica "ship it" e non vuole piu' passarci altro tempo sopra e vuole che si passi ad altro. Purtroppo e' successo a me, dopo venti anni sto ancora riscrivendo codice (scritto di getto) che non avrebbe MAI dovuto andare in produzione. Ho imparato la lezione, ho smesso di lavorare in quella maniera anni fa, mi rifiuto di sedermi davanti a un computer scrivendo codice senza avere prima fatto una seria analisi del progetto, incluse le implicazioni future (prima tra le quali, e' il prgramma scritto in modo che si possa facilmente cambiare e aggiungere nuove features. Diciamo che adesso passo un buon 60% solo a progettare, dopodiche' sedersi davanti al computer e scrivere il codice non ci vuole nulla.
Sulla tecnologia Agile ci sarebbe poi molto da dire. Come tutte le tecnologie, va usata bene, altrimente non serve a una cippa se non farsi una bocca grande di paroloni.
 
  • Mi piace
Reazioni: TheLastViper

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!