"Brudny kod"

0

Mam problem poniewaz wykladowca okresl moj kawalek kodu mianem "brudny" chodzilo mu o to ze jezeli metoda pobiera wiecej niz 3 parametry to powinienem przekazac (zwinac) je w formie tablicy.....Dodam ze parametry sa roznych typow....Jak to zrobic???
Ponad to jak potem zrobic to samo pobierajac parametry z kontrolek na formie..?

0

Pokaż ten kod. Każda klasy dziedziczy od Object.

0

Prawdopodobnie chodziło mu żebyś te parametry zamknął w strukturze/klasie, żebyś czytając kod za 3 tygodnie, wiedział "co autor miał na myśli".

0

Po prostu. W .NET wszystko dziedziczy po typie object (.NET'owe Object). Wstawiasz jako parametr tablicę obiektów i sprawdzasz czy nawet bez sprawdzania wykonujesz operacje na skonwertowanych obiektach.

2

Jeśli parametry mają ze sobą ściśle określony związek to możesz utworzyć klasę czy strukturę w której one będą.
Natomiast ja bym kodu takiego nie nazwał od razu brudnym. Po co, przypisywać do zmiennych na początku metody elementy tablicy obiektów, i dodatkowo rzutować, skoro można to zrobić w jednej linii, tej z definicją funkcji?

1
xeo545x39 napisał(a)

Po prostu. W .NET wszystko dziedziczy po typie object (.NET'owe Object). Wstawiasz jako parametr tablicę obiektów i sprawdzasz czy nawet bez sprawdzania wykonujesz operacje na skonwertowanych obiektach.

Panie, kto tak robi? Najgłupsza rzecz jaką można zrobić.

Jeżeli obiekty nie są w żaden sposób powiązane, to się ich nie ładuje na siłę do tablicy "Object".

7

ja tam uważam, że Twojego wykładowce po prostu ktoś tłukł jak był mały i dlatego teraz ma jakieś dziwne zachcianki

1

Ponizej fragment kodu, pominmy moze connect string etc...
chodzi o to jak przekazac parametry tak aby ich tyl nie bylo (max. 3) :-)
A cos takiego jak "Params"?

 



        public bool dodajPacjenta(string Imie, string Nazwisko, string Plec, string Pesel, DateTime DataUr, string Nip, string Kraj,
            string Miejscowosc, string Kod, string Ulica, string Kontakt, string Uwagi, string kod_nfz)
        {
                     
            OracleConnection conn = new OracleConnection(Constr);
            OracleCommand cmd = conn.CreateCommand();
            cmd.CommandText = "INSERT INTO PACJENCI ( Imie,  Nazwisko,  Plec, Pesel, Nip,  Kraj," +
                              "Miejscowosc,  Kod_Pocztowy, Ulica, Kontakt, Uwagi, kod_nfz,Data_Ur) VALUES" +
                              " ( :Imie,  :Nazwisko,  :Plec, :Pesel,"+
                              ":Nip,  :Kraj," +
                              ":Miejscowosc,  :Kod_Pocztowy, :Ulica, :Kontakt, :Uwagi, :kod_nfz,"
                              + " to_date('" + DataUr.ToShortDateString() + "','YYYY-MM-DD'))";
            
            cmd.Parameters.Add("Imie", OracleDbType.Varchar2, 32).Value = Imie;
            cmd.Parameters.Add("Nazwisko", OracleDbType.Varchar2, 32).Value = Nazwisko;
            cmd.Parameters.Add("Plec", OracleDbType.Varchar2, 2).Value = Plec;
            cmd.Parameters.Add("Pesel", OracleDbType.Varchar2, 11).Value = Pesel;
            cmd.Parameters.Add("Nip", OracleDbType.Varchar2, 13).Value = Nip;
            cmd.Parameters.Add("Kraj", OracleDbType.Varchar2, 32).Value = Kraj;
            cmd.Parameters.Add("Miejscowosc", OracleDbType.Varchar2, 32).Value = Miejscowosc;
            cmd.Parameters.Add("Kod_Pocztowy", OracleDbType.Varchar2, 6).Value = Kod;
            cmd.Parameters.Add("Ulica", OracleDbType.Varchar2, 48).Value = Ulica;
            cmd.Parameters.Add("Kontakt", OracleDbType.Varchar2, 128).Value = Kontakt;
            cmd.Parameters.Add("Uwagi", OracleDbType.Varchar2, 512).Value = Uwagi;
            cmd.Parameters.Add("kod_nfz", OracleDbType.Varchar2, 512).Value = kod_nfz;
           
            try
            {
                conn.Open(); 
                cmd.ExecuteNonQuery(); 
            }
            catch (OracleException ex)
            {
                MessageBox.Show(ex.Message.ToString(), "Błąd bazy danych"); 
            }            
            cmd.Dispose();
            conn.Dispose();
            return true;
        }

2

no to tutaj trochę poleciałeś :)
normalnie to masz klasę pacjent z właściwościami typu imie, nazwisko, ... i jedynie metodę dodaj bez parametrów a parametry do zapytania bierzesz z właściwości. Tą samą klasę masz jeśli chcesz zmienić/odczytać dane pacjenta - z klasą "komunikujesz" się przez te same właściwości a jedynie inaczej nazywasz metody do odczytu/zmiany/dodania. To jest tak bardzo ogólnie.

0

rozumiem ze nie opakowalem tego w klase jak nalezy, ale nawet jak to zrobie to i tak w ktoryms momencie musze wklepac te wszystkie parametry...

2

ale gdy zrobi strukturę to jej konstruktor i tak będzie przyjmował tyle argumentów, więc wykładowca także może powiedzieć "brudny kod"

Ale zrobi to w jednym miejscu, zamiast w dziesięciu różnych funkcjach jeśli chciałby ich zrobić więcej, poza tym może to robić przez properties, wcale nie musi od razu inicjalizowac wszystkiego w konstruktorze. Może jeszcze wydzielić dodatkową klasę np. Adres.

0
loocaszek napisał(a)

rozumiem ze nie opakowalem tego w klase jak nalezy, ale nawet jak to zrobie to i tak w ktoryms momencie musze wklepac te wszystkie parametry...

Owszem, ale wtedy zacznie to wyglądać jak program, a nie jak czarna rozpacz.
A dla płci lepiej zdefiniuj jakiś enum zamiast używać string.

0

koperniku " string Pesel, DateTime DataUr," tu masz juz rozne typy... string i datetime

0

@loocaszek gdybys tak bardzo chcial przekazac przez tablice a nie robic klase Pacjent to wszystkie procz tej daty masz typu string, wiec moglbys wrzucic je do tablicy stringow a datetime jako drugi argument.
Tak czy siak zrób to za pomoca klasy czy struktury a pozytywnie zaskoczysz wykladowce.

0

i tak zrobie, zwine stringi do tablicy... :-)

P.S.
na codzien administruje bazami Oracle to nie to samo co programowanie obiektowe :-)
no ale sporo konstruktywnej krytyki - dzieki...

0
ubuntuser napisał(a)

@loocaszek gdybys tak bardzo chcial przekazac przez tablice a nie robic klase Pacjent to wszystkie procz tej daty masz typu string, wiec moglbys wrzucic je do tablicy stringow a datetime jako drugi argument.

Skąd będziesz wiedział, który string w tablicy odpowiada za którą zmienną? To jest cholernie błędogenne i słabe rozwiązanie.

0

Skomentuje, opisze po indeksie :-)

0

Wciąż jest to złe rozwiązanie.

0

to moze po prostu obiektem row...?

1

Może po prostu utwórz klasę osoba i dodaj do niej to co masz na parametrach jako właściwości?

1
loocaszek napisał(a)

Skomentuje, opisze po indeksie :-)

I po takich programistach jak się kod poprawia to szlag człowieka bierze! Zrób klase z propertisami, a nie jakies pieerdoly wymyslasz. Typy proste jako parametry przydaja sie tylko w przypadku metod webservice'a, ktory ma byc wywolywany niekoniecznie z .net'a. A i tak wtedy robi sie po prostu nakladke na metode z klasa, ktora przed jej wywolaniem tworzy obiekt z parametrow.

4

@loocaszek gdybys tak bardzo chcial przekazac przez tablice a nie robic klase Pacjent to wszystkie procz tej daty masz typu string, wiec moglbys wrzucic je do tablicy stringow a datetime jako drugi argument.

Koniecznie chcesz stworzyć kod za który powinno się wieszać do góry nogami na całą noc, opierając się na dziwnym założeniu że takie jest zadanie. Wyraźnie zostało powiedziane że poprzednie rozwiązanie to "brudny kod", czyli trzeba stworzyć lepsze.

class UserData
{
    public string Imie { get; set; }
    public string Nazwisko { get; set; }
    public string Plec { get; set; } // to powinien byc enum
    public string Pesel { get; set; } // to bym opakowal w klase
    public DateTime DataUr { get; set; }
    public string Nip { get; set; } // to pewnie też
    // ... etc
}

Tworzenie:

UserData data = new UserData
{
    Imie = "Stefan",
    Nazwisko = "Batory",
    Plec = "M"
    DataUr = new DateTime(new Random().Next()),
    Nip = "123456"
    // etc
};

Lepiej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1