Polepszenie architektury/rozwiazania

Polepszenie architektury/rozwiazania
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

Chce napisac takie "cos" co mi wyeksportuje plansze do jsona (to jest najwazniejsze zadanie). Zrobilem to, ale nie podoba mi sie w tym pare rzeczy i nie za bardzo wiem jak to zmienic.

http://pastebin.com/U66tK1A3

tutaj jest do tego kod. Pisany dosc szybko, takze formatowanie w niektorych miejscach moze byc popsute.
GenerateBoard jest tylko po to zeby sprawdzic czy dziala json.

taki maly offtop po srodku Ktory code styleguide polecacie do c#?

Idea jest nastepujaca

  1. Aplikacja bedzie napisana w WPF
  2. Uzytkownik na poczatku podaje rozmiar mapy ktora nie moze sie zmienic. Dlatego na poczatku napisalem mSize_x, mSize_y, ale widze ze nie bedzie to potrzebne, bo jak sie zrobi data-grida to tam sie ustali na sztywno. Tego jeszcze nie obmyslilem jak do konca zrobie
  3. Uzytkownik moze wybrac sposrod trzech kategori (tlo, obiekt, przeciwnik) co chce umiescic na mapie
  4. Uzytkownik przeciaga np tlo (ktory zajmuje jedno miejsce w tablicy) na mape, na to moze dac obiekt a pozniej na to jeszcze moze dac przeciwnika (wiec background bedzie mialo najmniejszy wspolczynnik layer a enemy najwiekszy)
  5. Jak kliknie w opcje eksport, to wyekportuje to do pliku

Czego tutaj brakuje / mi sie nie podoba

  1. mam takie wrazenie ze mBackBoard mFrontBoard i mEnemyBoard jest troche lamaniem zasady DRY. Mimo wszystko inne, ale jednak korzysta sie z nich tak samo. Ja nie potrafie tego inaczej zrobic niz trzymanie trzech osobnych tablic skoro chce trzy inne kategorie. Co za tym idzie jest troche "duplikatow". Funkcje wygladaja praktycznie identycznie tylko nazwa zmiennej sie rozni.
  2. Czy nie za bardzo rozdrobnilem tych funkcji? Bo przez to zamiast robic raz for-loopa robie go trzy razy (dane sa male, takze pewnie jakbym zrobil jeszcze z 10 razy to odczuwalnej roznicy by nie bylo... ale jednak)

Za kazde uwagi bede wdzieczny :)

edytowany 1x, ostatnio: fasadin
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
1

InitializeXXXBoard możesz zastąpić jedną metodą, przekazując do niej konkretną listę.

A z innej strony zamiast mieć x list to możesz mieć jedną listę obiektów, które będą miały x pól

na prawdę potrzebne Ci są metody AssignToXXX? - przecież plansze masz publiczne


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
fasadin
teraz czuje sie glupio... to pierwsze takie oczywiste. z tym drugim nie rozumiem. Chodzi Ci o List<List<List<int>>> (czyli lista ktora bedzie zawierala te trzy listy)?
abrakadaber
abrakadaber
nie - List&lt;List&lt;TwojaKlasaTrzymającaNpTrzyInty&gt;&gt; - wg mnie dużo prościej będzie to rozszerzyć przez dodanie np. 4 pola
fasadin
ma to sens! dzieki wielkie
fourfour
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:627
1

No a tym samym tropem idąc może mieć też jedną metodę AssignToBoard. W sumie, można by pójść dalej - przerób kod tak, byś mógł mieć dowolną liczbę tablic, nie, @Shalom? :)

abrakadaber
abrakadaber
tylko wtedy ustawianie czegokolwiek na danej planszy używając tych metod będzie się mijało z celem bo prościej i czytelniej będzie odwołać się bezpośrednio do planszy po indeksach i przypisać wartość
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

macie racje, assignToBoard nie jest potrzebne.

Zmodyfikuje kod tak by byl uniwersalny i posiadal X list, ale problem jest taki ze... bedzie trzeba uzywac property dla kazdego obiektu z listy (by sie do niego dobrac). Wiec mimo ze moge miec X list, to i tak bede mogl uzywac tylko tych ktore zaimplementuje property... rozwiazanie nie jest idealne ;)

(property dla foreBoard, dla backBoard etc. Jak w przyszlosci bede chcial zaimplementowac kolejny np skyBoard to bede musial zrobic kolejne property)

edytowany 1x, ostatnio: fasadin
abrakadaber
abrakadaber
moja uwaga do Twojego poprzedniego postu
fasadin
tak, juz widzialem wlasnie implementuje :)
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

http://pastebin.com/BsRNDWfM

wyglada duzo lepiej :) wieczorem sobie to ladnie dopracuje :)

edytowany 1x, ostatnio: fasadin
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
2

pare rzeczy ktore bym zmienila (nic super powaznego, bardziej na zasadzie czepialstwa):

  • wywalic prefixy 'm' z nazw pol
  • wywalic '_' z nazw zmiennych
  • nazwy xIndex, yIndex wydaja sie troche zbyt dlugie, x i y w zupelnosci by wystarczyly
  • skoro rozmiar kolekcji jest staly to nie powinno byc mozliwosci mutowania jej z zewnatrz
  • klasy powinny byc sealed
  • wszystkie pola powinny byc readonly
  • List<List<BoardObjects>> powinno byc nowa klasa (lub ew. zamienione na BoardObjects[,])

co do code style to polecam guideline na msdn

0
katelx napisał(a):
  • wywalic prefixy 'm' z nazw pol
  • wywalic '_' z nazw zmiennych

Jeżeli chcesz stosować rozróżnienie prywatnych i publicznych składników to możesz stosować prefiksowanie znakiem _, np. private int _xSize. To chyba jedyny element, gdzie stosuje się znak podkreślenia zgodnie z coding style.

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
0
Krzywy Młot napisał(a):

Jeżeli chcesz stosować rozróżnienie prywatnych i publicznych składników to możesz stosować prefiksowanie znakiem _, np. private int _xSize. To chyba jedyny element, gdzie stosuje się znak podkreślenia zgodnie z coding style.

szczerze to nie wiem czy obecny coding style guidelines jest za stosowaniem podkreslenia, kiedys uzywalam '_' do prywatnych pol ale dalam sobie spokoj i obecnie nie uzywam zadnych magicznych prefixow poza 'I' przy interfejsach (co swoja droga nie jest ok, ale niestety framework stosuje taka konwencje i byloby to po prostu brzydkie gdybym to 'I' omijala; duzo bardziej podoba mi sie podejscie zastosowane np w jdk).
imho jesli klasy maja dobrze dopracowana strukture, odpowiedzialnosc i nazewnictwo skladowych to dodatkowe prefixy bardziej przeszkadzaja niz ulatwiaja.

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 24 godziny
2
katelx napisał(a):

szczerze to nie wiem czy obecny coding style guidelines jest za stosowaniem podkreslenia, kiedys uzywalam '_' do prywatnych pol ale dalam sobie spokoj

W zasadach kodowania dla CoreFx (https://github.com/dotnet/corefx/wiki/Coding-style) jest stwierdzenie "We use _camelCase for internal and private members", więc chyba obecny jest nadal za podkreśleniem. Ja osobiście zazwyczaj wolę po prostu nazywać z małej litery prywatne, z wielkiej publiczne i sprawa z głowy.

A może to przyzwyczajenie, ale jakoś mnie bardziej odpowiadają interfejsy z prefiksem I od konwencji z Javy.

edytowany 1x, ostatnio: Ktos
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1

Tego Randoma bym dał jako pole statyczne, no chyba że klika wywołań pod rząd ma dać ten sam wynik.

fasadin
to tylko do testowania czy json dziala, generowanie mapy bedzie przypisanie wszystkim wartosciom 0 :)
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

@katelx
prefixy m sa od member. Pomagaja mi w szybszej implementacji ;) (ale zamienie je na _)
wywale _ w nazwach zmiennych, ale dodam na poczatku, podoba mi sie code styleguide od Ktos'ia :)
Uzywalem przez dlugi czas x,y do 2d tablic. Jednak gdy przychodza duzo bardziej skomplikowane operacje, przydaje sie xIndex yIndex a raczej coIndex (bo w pewnym momencie musialem operowac na prawie dziesieciu indeksach...)
Jak zrobic by udostepnic ja (zeby mozna bylo zmieniac wartosci) ale zeby nie mozna bylo zmieniac wielkosci? (w sensie zeby nie mozna bylo uzyc funkcji Add) (wiem ze tablica rozwiazuje sprawe, ale nie o to chodzi ;))
sealed dodane :)
czyli uzywanie zmiennych w ramach tej samej klasy jest zle? Trzeba uzywac proprerty zamiast tego? Ma to po czesci sens (jezeli za kazdym razem zmienna musi miec jakas procedure przypisania), ale co jesli wewnatrz klasy trzeba miec inny sposob przypisywania? To wtedy usuwamy readonly? Bo w takim razie czesc bedzie readonly a czesc nie... troszke dziwnie
Co do ostatniego to calkowita racja, zapewnie zmienie na BoardObjects[,], pozniej jak projekt bedzie ewoluowal to zrobie z tego klase
sprawdze tego msdna ;)

@Ktos
Nie chce nazywac wszystko co publiczne z duzych (a raczej property) bo od duzych liter sa funkcje a nie zmienne ;) A ze kompilatory sa case sensitivity to pomaga pisac zmienne/property z malej

edytowany 2x, ostatnio: fasadin
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

@fasadin
List<List<BoardObjects>> odradzam takie konstrukcje ;) Bo szybko ewoluują w dziwne potworki typu Dictionary<String, Dictionary<String,List<Set<String>>>> w których to następnego dnia już sam nie wiesz co siedzi i co jest czym ;] A jedyne dostepne metody to metody standardowych klas.
Dużo wygodniej jest operować jednak na naszych własnych klasach ;) Bo przecież to List<BoardObjects> to jest coś co ma sens "biznesowy" w tej aplikacji. Może jednak warto objąć to w jakąś klasę która jasno określa co to jest? ;) Co więcej pozwala to też na ładne ukrycie implementacji i metod których użytkownik nie powinien widzieć i używać ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
fasadin
racja
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
0
fasadin napisał(a):

czyli uzywanie zmiennych w ramach tej samej klasy jest zle? Trzeba uzywac proprerty zamiast tego? Ma to po czesci sens (jezeli za kazdym razem zmienna musi miec jakas procedure przypisania), ale co jesli wewnatrz klasy trzeba miec inny sposob przypisywania? To wtedy usuwamy readonly? Bo w takim razie czesc bedzie readonly a czesc nie... troszke dziwnie

chyba nie do konca cie zrozumialam. w kazdym razie - nic nie trzeba, jednak jesli nie przewidujesz zmieniania pola/property to powinno byc readonly.
jesli pole jest prywatnie modyfikowane przez klase to oczywiscie nie moze byc readonly.
jesli pole jest modyfikowane przez klase a na zewnatrz jest do odczytu to mozesz zrobic property:

Kopiuj
 public Typ NazwaPola { get; private set; } 
DibbyDum
readonly w 99% przypadków będą zmienne inicjializowane w konstruktorze.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)