Konfigurator PC - jak zorganizować klasy?

0

Witam serdecznie. Mamy do wykonania taki projekt na zaliczenie z programowania obiektowego. Wychodzę więc z pytaniem, jak zorganizować to wszystko w klasy. Program ma za zadanie tworzyć zestaw komputerowy.
Aktualnie wymyśliliśmy, że tworzymy klasę Podzespół i po niej dziedziczą wszystkie podzespoły, ale wydaje mi się że to niezbyt optymalne rozwiązanie, biorąc pod uwagę mnogość różnych rodzajów podzespołów. Główna klasą byłaby klasa Zestaw, która zawierałaby tablice Podzespołów.

Ma ktoś może lepszy pomysł? Z góry dziękuje za pomoc.

0

oczywiscie ze jest mnogosc.
Jak polaczysz RAM (ktory ma rozne rodzaje, rozne wielkosci pamieci, rozne CL etc) z np karta graficzna?

Podzespoly sa ok.

Jedyna rzecza ktora bym zmienil to ze plyta glowna posiadala by komponenty (komponenty tez sa podzespolami)

czyli
Zestaw zawiera vector (nie tablice) podzespolow
plyta glowna jest podzespolem i zawiera vector komponentow
ram jest komponentem
komponent jest podzespolem.

dzieki takiemu rozwiazaniowi mozna fajnie filtrowac co mozna dodac do plyty glownej a co nie ;) (bo wiadomo rozne architektury)

I jezeli ktos by chcial zestaw bez plyty glownej, to nadalbyloby to mozliwe (bo komponenty sa podzespolem)

0

komputer MUSI składać się z zasilacza (1), obudowy (1), płyty głównej (1), procesora (ilość zależna od płyty głównej, ale w uproszczeniu można przyjąć że 1), dysków (1..*), pamięci (1..2-4 zależnie od płyty głównej), karty graficznej (0..2 - karta graficzna może być wbudowana w procesor - dostępne ustawienia muszą być zależne od wybranego procesora i płyty głównej), monitora, klawiatury, myszki
MOŻE dodatkowo mieć karty rozszerzeń - karta muzyczna, karta sieciowa, inne; ilość kart rozszerzeń jest również zależna od płyty głównej
MOŻE posiadać napęd optyczny, głośniki

Nie wpychałbym tego wszystkiego co musi być i to w konkretnej ilości do jednej kolekcji z rzeczami opcjonalnymi
Dostępne procesory są zależne od wybranej płyty głównej - tak samo od niej zależy ilość innych podzespołów

Jeżeli wepchniecie to do jednej kolekcji to później ciężko będzie wyświetlić dostępne procesory (najpierw trzeba będzie przeszukać kolekcję podzespołów szukając płyty głównej) i trzeba będzie wszędzie pilnować żeby nie wybrać więcej niż jednej płyty głównej itp

Najlepiej odzwierciedlić prawdę - zestaw składa się z jednostki centralnej i urządzeń peryferyjnych - jednostka składa się z zasilacza i płyty głównej do której podłączony jest procesor, karty rozszerzeń itp
Na etapie klasy płyty głównej będziesz mógł pilnować ilości dostępnych slotów pamięci, kart rozszerzeń, dysków itp.

0

co ma kolekcja do filtrowania ;o

kolekcja ma posiadac rzeczy ktore ktos wybral. A czy POZWOLI mu program wybrac to jest zupelnie inna bajka

0

nie wiem o co Ci chodzi

mi chodzi o to że w Twoim podejściu żeby filtrować listę dostępnych elementów, najpierw trzeba na liście wybranych elementów znaleźć płytę główną
w moim podejściu płyta główna jest zawsze jedna i odwołanie się do niej jest natychmiastowe

1

Zagadnienie którym się zajęliście, bardzo dobrze implementowane jest poprzez wzorzec projektowy Fabryka Abstrakcyjna http://pl.wikipedia.org/wiki/Fabryka_abstrakcyjna_(wzorzec_projektowy). Ja tu bardzo uproszczę bo doczytasz, Fabryka dostarcza rodzinę obiektów połączonych w określony sposób a ty jako klient prosisz Fabrykę o określony profil składanego PC. To co standardowo dostarcza Fabryka, możesz następnie dostosowywać (np. standardową kartę graficzną zamieniać na "potwora z szabansatoma-rdzeniami" :-) ). To Fabryka ma pilnować aby dana karta pasowała do określonej płyty (uzgodnienie interefejsów), ona wie co oznacza "PC profil serwer" oraz jaki swój dział poprosić o zbudowanie takiej rodziny obiektów.
Doczytaj o tym wzorcu. Tu masz jeszcze trochę komiksowo z przykładami w różnych językach https://sourcemaking.com/design_patterns/abstract_factory

0

Czyli jesli dobrze zrozumiałem. Klasa komponent dziedziczy po klasie podzespół.
Klasa płyty głównej dziedziczy po podzespole i dodatkowo zawiera vector komponentów(ram, procesor, itd.). Czyli dobrze rozumiem, że komponent to po prostu klasa która opisuje(?) podzespoły bazowe, bez których stworzenie komputera nie jest możliwe?

Dodając obiekt klasy płyty głownej (z wypełnionym vectorem: ramem, prockiem, itd) do zestawu, pozostaje mi tylko dodać inne podzespoły typu napędy, urzadzenia peryferyjne, a na przykład obliczanie ceny danego zestawu rozpoczynam od obliczenia ceny płyty głownej wraz z cenami dołączonymi do niej jako vector podzespołami bazowymi, a po obliczeniu tej ceny kontynuuje liczenie pozostałych podzespołów z klasy zestaw?

0

Nie twórz klas których sam nie rozumiesz / nie rozróżniasz / mają niewiele wspólnego z rzeczywistością

dysk twardy to "podzespół" czy "komponent", ram to "podzespół" czy "komponent"? Każdy powie że płyta główna, tak samo jak i ram to podzespół, a jednocześnie można je nazwać komponentami zestawu - taki podział wprowadza tylko zamęt

Fabryka nie wiem czy tu się nadaje - nie chcemy stworzyć obiektu o danych parametrach tylko go złożyć - user może chcieć zacząć od procesora - przy podziale który zaproponowałem że procesor wpina się do płyty głównej nie będzie można tak zrobić - tak samo fabryka nie bardzo się nada
Najlepsza chyba będzie tutaj płaska struktura przechowująca podzespoły

2

Tworzenie kilkuset klas, które nie różnią się w żaden sposób zachowaniem, nie jest dobrym pomysłem. Ja osobiście jestem przeciwnikiem patologii i zwolennikiem rzeczywistych rozwiązań, w tym przypadku zastosowania wzorca EAV. Potrzebne są cztery klasy:

  1. Zestaw
  2. Komponent
  3. Kategoria
  4. Parametr

Zestaw ma kolekcję Komponentów, a Kategoria ma kolekcję Parametrów. Komponent należy do jednej Kategorii. Parametr to po prostu para: klucz-wartość.
Przy tym podejściu dodanie nowego rodzaju podzespołu nie wymaga dodawania nowych klas. A walidację czy np. płyta pasuje do procesora zrobi się na podstawie wartości Parametrów o jednakowym kluczu.
No i jeszcze taki szczegół - takie coś da się zapisać w relacyjnej bazie danych.

Programowanie obiektowe nie polega na pisaniu klas tylko na używaniu ich do modelowania problemu.

0

Niestety somekind, fajne rozwiązanie, też nad czyms podobnym myślałem, ale problem polega na tym, że wymagania na ten projekt to 7-8 klas. Dziękuje wszystkim za pomoc.

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