Diagram klas biura projektowego

0

Nie mam żadnego doświadczenia w IO, ale chciałbym tworzyć sensowne diagramy.

Aktualnie mam za zadanie zbudować jeden dla specyfikacji jak poniżej:

Firma architektoniczna zajmuje się projektowaniem budynków. Są to głównie budynki
mieszkalne, ale również budynki użyteczności publicznej (np. szkoły, biurowce czy
szpitale). Budynki mieszkalne mogą być domami jednorodzinnymi lub blokami (3 lub 4-
piętrowymi). Dla wszystkich typów budynków określa się powierzchnię całkowitą oraz
użyteczną. Dla budynków mieszkalnych określa się liczbę mieszkań (na każdym piętrze
bloku) lub liczbę pomieszczeń (dla domu jednorodzinnego). Oczywiście w pierwszym
przypadku każde mieszkanie może również składać się z kilku pomieszczeń
(przynajmniej trzech). Każde mieszkanie i każdy dom jednorodzinny ma swojego
właściciela.

Stworzyłem diagram, ale mam wątpliwości co do połączenia budynku mieszkalnego z blokiem i domem jednorodzinnym (wielodziedziczenie, które zaznaczyłem, nie ma raczej sensu, ale nie wiem jak inaczej to zrealizować). Będę wdzięczny za opinie.

user image

1

Nie znam się na tych całych uml-ach, ale z tego rysunku można dziwne rzeczy wywnioskować. Jeżeli strzałka z pustym grotem znaczy w każdym przypadku to samo, to albo budynek mieszkalny ma bloki i domy jednorodzinne, albo piętro jest blokiem. Może ktoś, kto się na tym zna, mnie oświeci gdzie źle rozumuję?

Jeżeli dobrze widzę z lewej strony pełna strzałka oznacza kompozycję, ją bym ją zastosował do relacji blok piętro, piętro mieszkanie, dom jednorodzinny pomieszczenie itd. To na pewno nie powinno być dziedziczenie.

0

Chyba rzeczywiście zagalopowałem się z tym dziedziczeniem, podejrzewam, że teraz wygląda to lepiej. Liczności pisałem 'intuicyjnie', ale nie są chyba najważniejsze na początku?

user image

1

Zupełnie nie rozumiem tego diagramu. Budynek mieszkalny składa się z bloków, a mieszkanie z właścicieli? Jakaś czelabińska technologia.

Co to jest za klasa "powierzchnia budynku" i jaki jest sens jej istnienia?
Albo co to za klasa piętro i po co ona jest? Jej nazwa też jest do kitu, bo z diagramu wynika, że nie może istnieć mieszkanie na parterze.

Żeby narysować diagram należy:

  1. Wyodrębnić klasy występujące w problemie, czyli te ELEMENTY rzeczywistości, które są oddzielnymi bytami.
  2. Wypisać właściwości, którymi można opisać te klasy, czyli CECHY tych bytów.
  3. Znaleźć ZWIĄZKI między klasami. Agregacje, gdy coś z czegoś się składa, kompozycje, gdy coś nie może istnieć bez swoich obiektów podrzędnych, asocjacje, gdy coś z czymś się zwyczajnie łączy i generalizacje, gdy coś po czymś dziedziczy.

Ty z rzeczy, które ewidentnie są cechami mieszkań/budynków zrobiłeś klasy. Bo co to za klasa PowierzchniaBudynku? Czemu ona ma służyć niby? Jakie będzie miała właściwości?

0

Jest choć trochę lepiej?

user image

1

Hm,jeśli nie musisz koniecznie Marku bawić się tym UMLem,to imo lepiej go olać i nad zagadnieniem zastanowić się tak "na logikę" bez pierdzielenia się w rysowanie strzałek itp.Mi osobiście nigdy diagramy nie pomagały,wolę zwykły opis problemu.
Ja to widzę tak:
Absolutną podstawą jest Budynek-doskonały kandydat na jakąś klasę bazową.Teraz trzeba wydumać,co się na takowy Budynek składa,a jest tego niemało:
-z czego zbudowany (cegła,pustak,płyta itd)
-jakieś instalacje elektryczne itd
no ale,to na razie pomińmy,bo po diagramach widzę iż skupiasz się na aspekcie hm nazwijmy to mieszkalnym.Zatem każdy Budynek może mieć ileś pomieszczeń typu mieszkalne,użytkowe (jakieś piwnice czy insze garaże albo strychy) oraz kondygnacje/piętra.Ponadto wygodnie chyba będzie kilka pomieszczeń połączyć w klaster zwany Mieszkaniem.Zatem klasa Budynek wyglądałaby wstępnie tak(C++):

class Budynek
{
      List<Kondygnacja> kondygnacje;//kondygnacje zawierać będą listy wskaźników Pomieszczeń i ewentualnych Mieszkań
      
//a tu reszta,tj z czego zbudowany,instalacje elektryczne itd     
}
class Kondygnacja
{
      List<Pomieszczenie*> pomieszczenia;
}

powstaje pytanie,co zrobić z takimi elementami budynku jak schody czy windy,dołożyć po wskaźniku na Pomieszczenie użytkowe-szyb windy/schody,czy zrobić oddzielną listę na to.Ale,to już sam podumaj jak wolisz.

Moźna,i tak chyba będzie nawet lepiej potraktować Budynek jako coś zawierającego listę Pomieszczeń,a ich przynależność do Kondygnacji to robiłoby się dopiero w bardziej specjalizowanych klasach.

A,no i jeszcze ostatnia,ale istotna uwaga-staraj się wydumać jak najmniej klas,ułatwi to potem rozkimy apropos relacji pomiędzy nimi.

0

Też jest mi bliżej do takiego właśnie podejścia, rozpisuję sobie to po swojemu, ale w tej chwili mówią mi: rób diagramy w UML, twórz więcej elastycznych klas etc. Więc staram się je tworzyć, myślałem o zastąpieniu klasy Piętro kondygnacją, ale wyżej ktoś o wiele mądrzejszy ode mnie zakwestionował sens jej istnienia ;)
Dotąd diagramy miałem w głowie, ale nie były takie jak te (na pewno o wiele bardziej ulotne) i zapragnąłem czegoś się o tym dowiedzieć, tyle że bez doświadczenia wydaje się to na początku mocno niesprecyzowane, o zbyt wielu opcjach interpretacji. Mimo tego dzięki za odpowiedź, tutaj każda jest częścią jakiejś lekcji.

1

Zaczyna to nabierać kształtów. Zarówno Blok jak i Dom jednorodzinny są typami Budynków mieszkalnych. W takich sytuacjach stosuje się dziedziczenie, a nie asocjacje.
W ogóle nie widzę sensu istnienia na tym diagramie klasy Firma architektoniczna. Nie jest to część dziedziny problemu, którym tutaj jest zamodelowanie "budownictwa". Poza tym, związki których w jej przypadku użyłeś, oznaczają, że jeśli ta firma zniknie, to znikną też wszystkie budynki, a to jest bez sensu.
Co do tego nieszczęsnego piętra - widzę w treści zadania, że jest mowa o nim: "Dla budynków mieszkalnych określa się liczbę mieszkań (na każdym piętrze bloku)". Brzmi to tak, jakby mieszkania były pogrupowane w piętra, a piętra w blok. Zatem być może powinieneś jednak mięć tę klasę "piętro". Chociaż ja w takiej sytuacji w klasie Mieszkanie zrobiłbym po prostu pole "numerKondygnacji". (Bo tu o kondygnacje raczej chodzi niż o piętra.)

0

Myślę o zakończeniu w ten sposób:

user image

Zakładam na sztywno, że na parterze jest powódź albo inny interes (skoro nie ma o nim mowy w specyfikacji problemu).
Mówiono mi, że nie stosowanie kompozycji to asekuranctwo, że powinno się ją zastosować (przynajmniej po to, by móc się pomylić, dla nauczenia się czegoś), ale nie użyłem jej tutaj. Uznałem, że w budynku użyteczności publicznej mogą znaleźć się piętra, mieszkania, a już na pewno pomieszczenia. Czy ta postać ma sens?

1

Jak dla mnie,Budynek powinien być naprawdę bazową klasą,którą dałoby się opisać i Pałac Kultury i Nauki,chatkę w lesie na drzewie,stodołę i przybytek dumania zlokalizowany za nią oraz bunkier z II Wojny Światowej.
Takie założenie spełnia Budynek potraktowany jako zbiór pomieszczeń i przejść między nimi,które z kolei mogą być pogrupowane w mieszkania oraz piętra/kondygnacje+te różne takie w rodzaju typ budulca itd.

W takim układzie nie ma potrzeby mnożyć typów budynków (klas pochodnych),jedyne co Cię czeka Marku to przy klasie Pomieszczenie dać pole typ,które będzie określało czy to jest pomieszczenie mieszkalne,czy np piwnica.

Jak koniecznie chcesz uwzględniać przeznaczenie budynku jak mieszkalny czy użyteczności publicznej to załatw to nie nowymi klasami ale jakimś polem np string w którym tą informację będziesz trzymał.

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