Podział kodu na klasy i funkcje

0

Cześć,
Jestem nowym członkiem forum, proszę o wyrozumiałość. Pracuję jako programista embedded w "czystym C" programując STM32.
W firmie zaszła potrzeba napisania aplikacji okienkowej na Windowsa. Zdecydowano się na C++/CLI .net framework w Visual Studio. Nie pytajcie dlaczego C++/CLI. Szukając rozwiązań wcześniejszych problemów na każdym forum czytałem, żeby przesiąść się na C# i zostawić C++/CLI w spokoju, niemniej duża część aplikacji jest już napisana i tak musi zostać.
Z racji, że nie mam dużego doświadczenia w programowaniu obiektowym - (cały czas się go uczę, pisząc tą aplikację również), a posiadam jakieś doświadczenie w C zacząłem tworzyć mam wrażenie różne dziwne tworki i pojawia mi się garść pytań, na które mam nadzieję znajdę odpowiedź na tym forum ;-) Do rzeczy:

  • Dlaczego w przeróżnych poradnikach, tutorialach itp. definicje funkcji pisane są w plikach z rozszerzeniem .h?
    Jestem przyzwyczajony do rozdzielania deklaracji od definicji funkcji do oddzielnych plików (.h, .c) i trochę mnie to zastanawia skąd taki zwyczaj w wszystkich tutorialach C++/CLI.

  • Chcę mieć zestaw funkcji dostępnych w kilku okienkach np. dodanie serii na wykresie. Stworzyłem więc pliki MyChart.cpp oraz MyChart.h. Wykres wstawiłem z przybornika w Visual Studio więc instancja klasy tworzy się w konstruktorze tej formy. Chcąc zmienić jakieś parametry muszę mieć wskaźnik na ten obiekt. Czy moje rozwiązanie jest poprawne w podejściu obiektowym? Przekazuję wskaźnik na obiekt w parametrze funkcji. Jak się to robi zgodnie ze sztuką?

Stworzyłem nowy plik .c .h z funkcjami np: AddHorizontalBorderLine2Chart która dodaje serię do wykresu (pozioma linię) i przyjmuje w argumencie wskaźnik na wykres oraz "value" na jakim poziomie tą linię namalować.

void AddHorizontalBorderLine2Chart(DataVisualization::Charting::Chart^ chart, String^ bordername, int y_value){
  System::Windows::Forms::DataVisualization::Charting::Series^ series = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
  series->Name = bordername;
  series->Points->AddXY(chart->ChartAreas[0]->AxisX->Minimum, y_value);
  series->Points->AddXY(chart->ChartAreas[0]->AxisX->Maximum, y_value);
  series->ChartArea = L"ChartArea1";
  series->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::Line;
  series->Color = System::Drawing::Color::Red;
  series->BorderWidth = 3;
  chart->Series->Add(series);
}

Funkcję wywołuję w okienku, na zdarzenie wciśnięcia przycisku.

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
  AddHorizontalBorderLine2Chart(chartFotoSensors, "granica2", 70);
}

Generalnie to działa i rozwiązało mój problem natomiast mam dziwne przeświadczenie że robię to bardzo na około.
Podpowiecie jak to powinno wyglądać w podejściu obiektowym?

Dzięki z pomoc i pozdrawiam :D

4

@Yankee3:

C++/CLI to koszmar.

Nie angażuj się w to. On tylko pozornie ma coś wspólnego z C. Tyle ma wspólnego co dialekt z Chinatown z angielskim

3
Yankee3 napisał(a):
  • Dlaczego w przeróżnych poradnikach, tutorialach itp. definicje funkcji pisane są w plikach z rozszerzeniem .h?
    Jestem przyzwyczajony do rozdzielania deklaracji od definicji funkcji do oddzielnych plików (.h, .c) i trochę mnie to zastanawia skąd taki zwyczaj w wszystkich tutorialach C++/CLI.

Mógłbyś po prostu wpisać w google "c why files h and c". Pierwsza odpowiedź w google: https://stackoverflow.com/questions/1695224/what-do-c-and-h-file-extensions-mean-to-c

Yankee3 napisał(a):

Generalnie to działa i rozwiązało mój problem natomiast mam dziwne przeświadczenie że robię to bardzo na około.
Podpowiecie jak to powinno wyglądać w podejściu obiektowym?

A chcesz przejść na obiektowy czemu?

3

Zacznij może od obejrzenia tego wątku https://4programmers.net/Forum/C_i_C++/359671-minimalistyczne_gui_oraz_utility_na_rok_2022
Jak siedzisz w Embedded to może Twoje serce skradnie https://lvgl.io/ i nie będziesz się zmuszał do obiektów :)
Wszystko zależy od tego co robisz i co potrzebujesz

0
Riddle napisał(a):
Yankee3 napisał(a):
  • Dlaczego w przeróżnych poradnikach, tutorialach itp. definicje funkcji pisane są w plikach z rozszerzeniem .h?
    Jestem przyzwyczajony do rozdzielania deklaracji od definicji funkcji do oddzielnych plików (.h, .c) i trochę mnie to zastanawia skąd taki zwyczaj w wszystkich tutorialach C++/CLI.

Mógłbyś po prostu wpisać w google "c why files h and c". Pierwsza odpowiedź w google: https://stackoverflow.com/questions/1695224/what-do-c-and-h-file-extensions-mean-to-c

Yankee3 napisał(a):

Generalnie to działa i rozwiązało mój problem natomiast mam dziwne przeświadczenie że robię to bardzo na około.
Podpowiecie jak to powinno wyglądać w podejściu obiektowym?

A chcesz przejść na obiektowy czemu?

Po prostu chce się nauczyć programowania obiektowego.

0
Adamek Adam napisał(a):

Zacznij może od obejrzenia tego wątku https://4programmers.net/Forum/C_i_C++/359671-minimalistyczne_gui_oraz_utility_na_rok_2022
Jak siedzisz w Embedded to może Twoje serce skradnie https://lvgl.io/ i nie będziesz się zmuszał do obiektów :)
Wszystko zależy od tego co robisz i co potrzebujesz

Bardzo dziękuję. Na pewno zainteresuje się tematem LVGL. Widzę bardzo duże zastosowanie tej biblioteki w projektach embedded natomiast teraz piszę aplikację desktopową pod Windowsa i chcę to zrobić zgodnie ze sztuką.

2

LVGL działa tez na Windows/Linux , mam projekt w którym wersja embedded (ARM) została przekompilowana(plus drobne poprawki) na 100% sprawne emulatory urządzenia embedded na platformie Windows/Linux aby użytkownicy mogli pobawić się bez sprzętu .
Napisz co dla Ciebie znaczy "zgodnie ze sztuką" ? Dziwna to teatr gdzie gra C++/CLI.
Zawsze możesz tez aplikacje zrobić w innej technologi a obecny kod upchnąć do DLL

6

Cppcon i wykłady przykłady powinny rzucić ci światło na to co chcesz zrobić. Tu na forum chyba w dziale inżyniera oprogramowania była dyskusja o SOLID poszukaj
zacyznamy od
Back to Basics: Object-Oriented Programming - Jon Kalb - CppCon 2019

aż po CppCon 2018: Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design”

:)

edit:

 void AddHorizontalBorderLine2Chart(DataVisualization::Charting::Chart^ chart, String^ bordername, int y_value){
  System::Windows::Forms::DataVisualization::Charting::Series^ series = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
  series->Name = bordername;
  series->Points->AddXY(chart->ChartAreas[0]->AxisX->Minimum, y_value);
  series->Points->AddXY(chart->ChartAreas[0]->AxisX->Maximum, y_value);
  series->ChartArea = L"ChartArea1";
  series->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::Line;
  series->Color = System::Drawing::Color::Red;
  series->BorderWidth = 3;
  chart->Series->Add(series);
}

Taka uwaga a dlaczego nie możesz zrobić tego bez przekazywania chart?(I tu wracamy do wyżej wymienionych wykładów, refactoringu, solid itd.)

w stylu:

System::Windows::Forms::DataVisualization::Charting::Series GenerateSeries(int y_value);
chart->Seriess->Add(GenerateSeries(value));

edit2:
Może tylko ja tam mam ale za te nazwy z 2 jako to bym od razu walił komentarze w review.

0
Yankee3 napisał(a):
Riddle napisał(a):
Yankee3 napisał(a):
  • Dlaczego w przeróżnych poradnikach, tutorialach itp. definicje funkcji pisane są w plikach z rozszerzeniem .h?
    Jestem przyzwyczajony do rozdzielania deklaracji od definicji funkcji do oddzielnych plików (.h, .c) i trochę mnie to zastanawia skąd taki zwyczaj w wszystkich tutorialach C++/CLI.

Mógłbyś po prostu wpisać w google "c why files h and c". Pierwsza odpowiedź w google: https://stackoverflow.com/questions/1695224/what-do-c-and-h-file-extensions-mean-to-c

Yankee3 napisał(a):

Generalnie to działa i rozwiązało mój problem natomiast mam dziwne przeświadczenie że robię to bardzo na około.
Podpowiecie jak to powinno wyglądać w podejściu obiektowym?

A chcesz przejść na obiektowy czemu?

Po prostu chce się nauczyć programowania obiektowego.

No o to pytam, czemu? Masz jakiś powód ku temu?

5
Yankee3 napisał(a):
Riddle napisał(a):

A chcesz przejść na obiektowy czemu?

Po prostu chce się nauczyć programowania obiektowego.

To C++/CLI jest najgorszą mozliwa metoda do tego. Upie... się w szczegółach formalnych (zwłaszcza tych wynikajacych z siedzenia okrakiem na dwóch krzesłach), i nigdy nie dotkniesz istoty.

Po drugie, żadne GUI nie jest dobrą plaformą do nauki programowania obiektowego. Mam mocne argumenty, ale bardzo długie, za długie na post. Nawet jesli samo w sobie to czy inne GUI bu miało niezłą wewnętrzną architekturę obiektową.
W skrócie: ogrom czarów "pod maską" (czyli funkcjonalnosc nie wynika z kodu, który piszesz), oraz spychanie użutkownika na pozycja zgoła nie obiektowe.

Stosunkowo najmniej złym, i całkiem niezłym dla kogoś obytego w podstawach OOP był odchodzący Java Swing. Najlepszy w kategorii "trochę nauczy" i "zrobi najmniej krzywdy"

2
AnyKtokolwiek napisał(a):

Stosunkowo najmniej złym, i całkiem niezłym dla kogoś obytego w podstawach OOP był odchodzący Java Swing. Najlepszy w kategorii "trochę nauczy" i "zrobi najmniej krzywdy"

Swing już dawno "odchodzi", nawet powstał FX niby taki gwóźdź do trumny, z tym że FX już dawno umarł zaś Swing wciąż "odchodzi" ...

0
_13th_Dragon napisał(a):
AnyKtokolwiek napisał(a):

Stosunkowo najmniej złym, i całkiem niezłym dla kogoś obytego w podstawach OOP był odchodzący Java Swing. Najlepszy w kategorii "trochę nauczy" i "zrobi najmniej krzywdy"

Swing już dawno "odchodzi", nawet powstał FX niby taki gwóźdź do trumny, z tym że FX już dawno umarł zaś Swing wciąż "odchodzi" ...

To jaka jest lepsza technologia do UI aplikacji desktopowych jak nie JavaFX?

1
Riddle napisał(a):
Yankee3 napisał(a):
  • Dlaczego w przeróżnych poradnikach, tutorialach itp. definicje funkcji pisane są w plikach z rozszerzeniem .h?
    Jestem przyzwyczajony do rozdzielania deklaracji od definicji funkcji do oddzielnych plików (.h, .c) i trochę mnie to zastanawia skąd taki zwyczaj w wszystkich tutorialach C++/CLI.

Mógłbyś po prostu wpisać w google "c why files h and c". Pierwsza odpowiedź w google: https://stackoverflow.com/questions/1695224/what-do-c-and-h-file-extensions-mean-to-c

Przecież to dosłownie nie odpowiada na pytanie.

1

Inaczej,
co do mojego problemu, to przeszedłem na C# i zacząłem od początku. Jest dużo łatwiej i chyba będzie szybciej niż męczyć się w tym C++/CLI mimo że nie znam C#.
Jestem Wam winny wyjaśnienia skąd w ogóle pomysł na pisanie w CLI. Otóż w firmie kupiliśmy kilka kursów programowania aplikacji desktopowych, bazodanowych itp na potrzeby szybkiego startu projektu.
https://strefakursow.pl/kursy/programowanie/kurs_c_aplikacje_w_visual_studio.html
Ten wydawał się super, ale jak się okazało jest prowadzony właśnie w C++/CLI. Do tego ma prawie 10 lat, a sami wiecie, że to przepaść w IT.

Kolejny z aplikacji bazodanowych tego samego autora również.
Z racji że nie miałem doświadczenia w pisaniu aplikacji desktopowych zabrałem się do pracy od tego kursu..... i wpakowałem się w bagno.
Życie...

Jaki kurs polecicie do nauki C#,
Jaką książkę?

Słyszałem o C# Rusz głową Head First.

PS może ostatnio nieprecyzyjnie odpowiedziałem na pytania więc jeszcze raz: Chce nauczyć się programowania obiektowego, ale muszę aktualnie zrobić aplikację okienkową.
Odpowiedzi pokroju pisanie aplikacji okienkowych to najgorszy sposób nauki OOP nie rozwiązują mojego problemu.
Pozdrawiam,

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