Като начинаещ програмист, току-що изучаващ основите на ООП, се натъкнах на много проблеми с основната структура на включване на моите практически програми. Сам съм се учил на програмиране, използвайки различни писмени и онлайн ресурси. Но ето моят проблем (е, един от тях...):
От една страна, разбирам значението на абстракцията, капсулирането и ниската степен на свързване между класовете, но от друга страна, изпитвах огромни затруднения със структурирането на моята програма и проектиране на моите класове по начин, който позволява на различни класове в различни файлове да знаят един за друг.
Разбира се, това е основен мой проблем, който доведе до небрежен, хакерски код, който работи само по начина, по който аз искам, след като изхвърлих всеки основен OOP през прозореца и започнах да попълвам кода си с глобални променливи, препращам декларации за всичко навсякъде и правене на членовете на класа публични.
Най-просто казано: Моето програмиране е бъркотия... C++ е първият ми език за програмиране и дори когато се опитвам да направя всичко възможно да проектирам/пиша по обектно ориентиран начин, завършвам с грозна бъркотия от файлове, #включително всичко в почти всеки файл и странна комбинация от процедурен и ООП спагети код, който рядко работи!
Аз съм самопровъзгласил се за начинаещ в програмирането и приемам, че отнема време, за да се науча как да структурирам програма, но съм почти на края на акъла! Знам, че проблемът ми произтича от факта, че знам малко за ООП. Знам, че искам да напиша независими класове, които се справят с една задача. Но в същото време не разбирам как правилно да предупредя всеки клас за съществуването на другите части на програмата. Това е малко като да знаете какви видове храна трябва да ядете, но да не знаете как да използвате вилица...
Това е моят проблем накратко. И за да продължа с някои по-конкретни въпроси, които имам:
В C++ многофайлов проект нормално/необходимо ли е функцията main() да се постави в собствен клас? Или е стандартното нещо да оставите вашия main() в глобалния обхват?
В предишни процедурни програми, които съм написал на C++, не беше необичайно да има константи променливи или #defines в глобалния обхват, в горната част на файла main.cpp. Например, може би размерите на екрана или друга полезна информация ще бъдат определени в началото на програмата. Какво се случва в OOP? Тази практика трябва ли да се избягва напълно? Или да направя файл MAIN.H и да го #включа във всеки друг хедър в проекта? Нямам идея какво да правя по въпроса...
Когато написах първата си средна по размер практически ООП програма, работата ми спря рязко, когато започнах да се опитвам да напиша клас StateMachine. Моето намерение беше класът StateMachine да съдържа всички възможни състояния на екрана, които програмата ще използва. Въпреки това възникна проблем, при който класът ми StateMachine изглежда не беше наясно с някои от другите ми класове State, въпреки че всички те бяха #included. Виждал съм хора да правят декларации за класове напред, необходимо ли е това? Трябва ли да изпращам спам навсякъде с декларации за класове или това мирише на код?
И накрая, има ли значение редът на командите за декларация #include и forward?
Знам, че това вероятно е супер основен въпрос, но това е нещо, което ми създаваше много трудности в прехода ми от еднофайлови процедурни C++ програми за начинаещи към многофайлово ООП програмиране. Има ли някакво общо правило за структуриране на вашите програми, така че всичко да работи? Използвал съм предпазители за включване, така че има ли причина човек да не може просто да #включи всяко заглавие във всеки изходен файл? Трябва ли да имам файл common.h, който е #включен във всеки заглавен файл за всеки клас?
Наистина оценявам всяка помощ/съвет, който общността може да ми даде. Знам, че това е просто, но важно препятствие, което трябва да преодолея, преди да започна да развивам уменията си за ООП. Опитвах се да пробия в мозъка си колко е важно класовете да бъдат разделени един от друг до точката, в която не съм сигурен как наистина да настроя класовете/файловете си по начин, който им позволява наистина да взаимодействат един с друг! Благодаря много за помощта!