Programowanie obiektowe - przeklęta if'ologia

0

Witam serdecznie
Tworzę aplikację, która ma za zadanie testować wydajność zapytań w różnych systemach bazodanowych. Utworzyłem sobie klasę abstrakcyjna Database, która stanowi klasę bazową dla klas potomnych, które reprezentują określone bazy danych. Jest to prosta aplikacja w Windows Forms C#. Mam tam gridy i obiekty treeView(nieco zmodyfikowane jako moje własne kontrolki). Problem leży w tym, że potrzebuje ładować dane do tych kontrolek. Dzięki abstrakcji nie muszę wykonywać wszystkich operacji dla każdej klasy - np. pobranie listy tabel i wsadzenia ich do obiektów treeView. Problemem jest w sytuacji kiedy mam te dane ładować jako źródło danych do konkretnego TreeView. W konsekwencji powstaje taki koszmarek jak poniżej. Pytanie jak to załatwić, żeby było ładnie i zgrabnie.

if (database.type == Database.DatabaseType.SQLServer)
         this.treeViewWithTablesSqlServer.SetDataSource(database.TableList);
else if (database.type == Database.DatabaseType.MySQL)
         this.treeViewWithTablesMySQL.SetDataSource(database.TableList);
else if (database.type == Database.DatabaseType.PostgreSQL)
          this.treeViewWithPostgreSQL.SetDataSource(database.TableList);
else if (database.type == Database.DatabaseType.OracleDB)
          this.treeViewWithOracleDB.SetDataSource(database.TableList);
 
1

Nie bardzo rozumiem problem. Nie mozesz zwiazać ze sobą tego tree view z obiektem database w chwili ich tworzenia? Wtedy wszystko się zrobi "samo" za pomocą Strategii.

0

Zastosuj tu polimorfizm

0

Enumy w C# są dziwne i stąd problem. Można dodać im metody za pomocą rozszerzenia, ale równie dobrze można użyć klasy zapieczętowanej, która będzie miała odpowiednie działanie:

public sealed class DatabaseType{
    
        private string dbName;
        
        public void buildTree(){
         Console.WriteLine(dbName);
        }
        
        public static readonly DatabaseType SqlServer = new DatabaseType("SQL Server");
        public static readonly DatabaseType MySql = new DatabaseType("MySql");
        
        private DatabaseType(string dbName){
            this.dbName = dbName;
        }

    }

ps. Oczywiście zamiast stringa jako parametry podajemy odpowiednie obiekty.

0

Dlaczego database nie ma po prostu oddzielnych TableList dla różnych typów baz? Przy takim podejściu nie musiałbyś mieć żadnego ifa.

0
somekind napisał(a):

Dlaczego database nie ma po prostu oddzielnych TableList dla różnych typów baz? Przy takim podejściu nie musiałbyś mieć żadnego ifa.

Nie bardzo mi się podoba zastosowanie oddzielnych TableList dla wszystkich typów baz, powstaje zbędna nadmiarowość (chociaż lepsza nadmiarowość niż if'ologia). Kolekcje te przechowują w zasadzie to samo - listę tabel tylko, że dla oddzielnej bazy danych. W przyszłości jeżeli będę chciał stworzyć listę widoków, procedur składowanych dla bazy to nie będę za każdym razem tworzył tyle elementów do klasy bazowej.

0

Klasy mają mieć datasety, do których ładujesz dane po odpowiednim zapytaniu. Tyle. Jeden dataset na jedną klasę.

0
Juhas napisał(a):

Klasy mają mieć datasety, do których ładujesz dane po odpowiednim zapytaniu. Tyle. Jeden dataset na jedną klasę.

Przecież wg opisu autora każda klasa posiada swoją kolekcję przechowującą to co chce. Problemem jest związanie obiektów TreeView z danym obiektem utworzonym z klasy potomnej. Ponieważ jak widzę mamy kilka obiektów treeView i każdy jest przyporządkowany do konkretnej bazy danych. Zresztą koledzy wyżej podali rozwiązania.

1
a.dudek76 napisał(a):

Nie bardzo mi się podoba zastosowanie oddzielnych TableList dla wszystkich typów baz, powstaje zbędna nadmiarowość (chociaż lepsza nadmiarowość niż if'ologia). Kolekcje te przechowują w zasadzie to samo - listę tabel tylko, że dla oddzielnej bazy danych. W przyszłości jeżeli będę chciał stworzyć listę widoków, procedur składowanych dla bazy to nie będę za każdym razem tworzył tyle elementów do klasy bazowej.

To może inaczej spytam - czemu masz 4 x TreeView, skoro w jednej chwili masz wypełnione tylko jedno?

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