Чому добре розділити програму на кілька класів? [зачинено]


62

Я ще учень середньої школи (вступає в 10 клас), і мені ще належить пройти фактичний комп’ютерний курс у школі. Все, що я робив до цього часу, - це через книги. Ці книги навчили мене таким поняттям, як спадкування, але як допомагає розщеплення програми на кілька класів? Книги мені ніколи не розповідали.

Я запитую це головним чином через нещодавній проект. Це аркадна відеоігра, схожа на флеш-гру, як казали деякі люди (хоча я поняття не має, що це Flash-гра ). Річ у тому, що це лише один клас. Це прекрасно працює (але зрідка відставання) лише з одним класом. Отож, я просто запитую, як би розділення його на кілька класів допомогло б йому.

Цей проект був на Яві, і я єдина людина, яка працює над ним, для запису.


1
Щоб зробити кожен фрагмент програмного забезпечення простішим! infoq.com/presentations/Simple-Made-Easy-QCon-London-2012
TehShrike

49
Читаючи ваші книги, вони були розділені на глави та розділи? Ми розділили програму на класи, щоб упорядкувати речі, подібно до того, як книги ділять текст на глави, щоб упорядкувати речі.
riwalk

12
Римляни раніше говорили: podije et impera.
Джорджіо

7
@Giorgio: або англійською мовою, тому що латинська мова вже не використовується так: Divide And Conquer .
Матьє М.

40
Враховуючи, що ви перебуваєте в 10 класі, і вже змогли сформувати інтелектуальне запитання, надавши всі деталі, необхідні для хороших відповідей, надання контексту та вашого відносного досвіду, а також довідкову інформацію про те, чому ви ставите питання; ви вже більш кваліфіковані, ніж багато людей, з якими я зараз працюю ...
CaffGeek

Відповіді:


71

Найпростіша відповідь полягає в тому, що якщо ви кладете все в один клас, вам доведеться хвилюватися про все одразу, коли ви пишете новий код. Це може працювати для невеликих проектів, але для величезних додатків (ми говоримо сотні тисяч рядків) це швидко стає поруч із неможливим.

Щоб вирішити цю проблему, ви розбиваєте фрагменти функціональності на власні класи та інкапсулюєте всю логіку. Тоді, коли ви хочете працювати над класом, вам не потрібно думати про те, що ще відбувається в коді. Ви можете просто зосередитись на тому невеликому фрагменті коду. Це безцінно для ефективної роботи, однак важко оцінити без роботи над величезними додатками.

Звичайно, існує незліченна кількість переваг розбиття коду на більш дрібні шматочки: код є більш ретельним, більш перевіреним, багаторазовим використання тощо, але для мене найбільша перевага полягає в тому, що він робить масивні програми керованими, зменшуючи кількість коду, який ви потрібно задуматися за один раз.


7
Дуже багато концепцій / ідей в програмуванні (принципи ОО, розподілене управління джерелами, стандарти кодування) мають справді сенс лише тоді, коли ви працюєте над відносно великими проектами в команді. Ви зрозумієте, чому, коли ви фактично працюєте над такими проектами.
joshin4colours

40
Варто зазначити, що просто розбиття проекту на кілька класів / файлів не дуже допомагає. Дійсно важливо мати автономні класи, тому для зміни одного класу не потрібно знати нічого іншого про програму (а для використання класу не потрібно ніяких знань про те, як вона була реалізована). Я підводжу це, тому що часто бачу код з великою кількістю класів, але немає реального інкапсуляції. Інкапсуляція є важливою частиною - як ви цього досягаєте, це лише деталі.
Відновіть Моніку

2
Деякі ключові слова будуть "з'єднання" або "роз'єднання", "капсулювання", "приховування інформації".
marktani

@BrendanLong, я погоджуюсь і додам, що інкапсуляція майже неможлива. Якщо ви, звичайно, не пишете окремих програм ... Але звичайно багато частин, які не залежать одна від одної, а мають лише спільні залежності
Jo So

29

Ну, найпростіша відповідь може бути "Це допомагає впорядкувати речі". Якщо нічого іншого, ви можете порівняти його з розділами в зошиті - це просто простіше, якщо у вас є "всі речі, що стосуються інтерфейсу користувача", і "всі речі, що стосуються геймплея" там.

Більш витончена відповідь полягає в тому, що підбадьорювати роботу не просто зручно, але дуже важливо для управління складністю (а "управління складністю" - це в значній мірі назва гри, якщо мова йде про програмування). Класи або інші типи модулів дозволяють "розділити проблеми". Ви не тільки знаєте, де шукати "речі, пов’язані з інтерфейсом користувача", але можете бути впевнені, що якщо ви хочете внести зміни в інтерфейс користувача, ви можете просто внести його в одне місце, і вам не потрібно хвилюйтеся "зараз це єдине місце, де я встановив свій шрифт на Comic Sans?". І ви можете внести зміни і знати, що ефект від цієї зміни полягає лише в тій чи іншій (малій) області, яка є доречною. Якщо все в одному класі або модулі, по суті все є глобальним,

У конкретному випадку класів як типу програмного модуля також існує велика кількість поведінки, пов’язаної з класом, і більшість розробників об'єктно-орієнтованої парадигми вважають дуже корисним наявність значущих імен, пов’язаних із класами, які пов'язані з групою функціонує разом. Тож ви, мабуть, насправді не мали б UIкласу, ви, мабуть, мали б Buttonклас. Існує цілий комплекс знань і прийомів, пов'язаних з об'єктно-орієнтованим дизайном класів, і це найпоширеніший спосіб організації великих систем в основному програмуванні.


12

Це гарне запитання! Простий і добре запитуваний. Ну ... відповідь не така проста для розуміння для студента, який вивчає інформатику і, ймовірно, не знає глибокого ОО та, ймовірно, не має досвіду роботи.

Отже, я можу відповісти, описуючи сценарій і змушуючи уявити, як програмне забезпечення для багатьох класів краще, ніж монолітне програмне забезпечення (зроблене лише одним класом):

  • Читання : набагато складніше переглядати та записувати код у файл із 10000 рядками, ніж кілька маленьких та організованих файлів.
  • Повторне використання : Якщо ви пишете один клас, ви можете пропустити дублювання коду . Це означає більше рядків коду та, ймовірно, більше помилок (!)
  • Заповідність : Що з тестуванням однієї функціональності? Якщо ви виділите одну логічну функціональність в одному класі, ваше життя буде простішим.
  • Обслуговуваність коду : Ви можете виправити помилку або підвищити функціональність за допомогою мультиплікаційних класів в одному місці: Приємні маленькі класи.
  • Структура проекту : oooooh, ви можете собі уявити, наскільки потворним буде проект із лише одним вихідним файлом?

Мені подобається ваша відповідь, і я щойно вніс деякі зміни (які все ще потрібно перевірити). Я сумую за простішим виявленням змін у таких версіях версій програмного забезпечення, як SVN / GIT. Також простіше працювати з декількома програмістами паралельно для одного проекту.
Мартін Тома

Я б сказав, що розділення проблем, згуртованості та роз'єднання - це концепція, яка є набагато вищою сферою, ніж дисципліна ООП. Імперативні, логічні та функціональні програмісти всі прагнуть до високої згуртованості та низької зв'язку.
сара

8

Тут є багато хороших відповідей, і я, безумовно, погоджуюся з ними, але я відчуваю, що є щось більше, що варто згадати.

На даний момент, як ви вже говорили, ви працюєте соло над своїм проектом. Однак у майбутньому настануть періоди, коли вам потрібно буде працювати в командній обстановці. У той час ви будете розділяти роботу (імовірно, проект буде досить великим). Як результат, є кілька (я думаю, справді два основні ) різні варіанти. Ви можете мати кілька копій одного файлу та працювати над окремими "фрагментами" файлу, а потім "комбінувати" їх з копією та вставити пізніше, а потім змінити, щоб ваші частини могли працювати разом, або ви можете розділити ці "шматки" досить легко перейдіть у різні класи та обговоріть, як ви будете писати ці заняття, і використовуйте ці знання, щоб продовжувати.

Ще потрібно буде працювати над об'єднанням усіх окремих частин разом, але це буде набагато простіше в обслуговуванні. Оскільки файл x містить y-код, і це код, який ви знаєте, що вам потрібно змінити. Це входить в організаційну річ, про яку йдеться в більшості інших відповідей.

Проведення програми в голові. Посилання від Джорджіо


1
+1: Важлива також робота в команді! Див., Наприклад, paulgraham.com/head.html та абзац із заголовком "Не можу багато людей редагувати один і той же фрагмент коду."
Джорджіо

@ Джорджіо Я начебто лише пробирався через нього, але здається дивним ресурсом! Я додам його до своєї відповіді просто тому, що деякі люди можуть не дивитись у розділі коментарів. Однозначно збираюся трохи детальніше прочитати деякий час.
Сефаллія

Це стосується і контролю за редагуванням - робота над окремими файлами означає менше конфліктів та злиття.
Відновіть Моніку

7

Насправді те, що ви зробили, - це знову придумане процедурне програмування. Зауважте, що цілком можливо писати програмне забезпечення таким чином, і компілятор, ймовірно, не піклується. Протягом багатьох років так робилося, поки комп'ютери не стали швидшими, а інструменти покращилися.

Якщо говорити, якщо ви розділите свій код на різні логічні одиниці (класи, модулі тощо), це те, що у вас може бути багато коротких простих для розуміння фрагментів коду. які можна зберегти пізніше. Багато моїх модулів мають менше 20 рядків коду. Я знаю, що весь код на даній темі знаходиться в певному місці. Це також означає, що якщо хтось інший приєднається до проекту, у них буде набагато простіший час знайти речі.

Як сказав Джеральд Суссман, наші програми повинні бути написані першими, щоб люди могли її читати, а вдруге, щоб комп'ютер міг її запускати. (І якщо ви не читали "Структура та інтерпретація комп'ютерних програм, ви повинні")


4

Один використовує кілька класів, тому що, потрапляючи у більші речі, ви просто не зможете відстежувати все, коли це одна велика купа коду.

Вам просто потрібно розділити і перемогти, щоб впоратися з цим.


3

Об'єктно-орієнтоване програмування - найкраща ідея, яку я коли-небудь бачив у програмуванні. Але це не найкраще у всіх випадках, вам потрібно трохи досвіду програмування, щоб побачити сенс цього, і багато людей претендують на виконання OOP, коли їх немає.

Якщо ви можете знайти "структуроване програмування", ви, ймовірно, знайдете щось більш корисне відразу. (Переконайтеся, що ви читаєте про старе структуроване програмування. Старі терміни часто отримують нові, більш химерні значення, і вам ще нічого не потрібно фантазії.) Це досить проста концепція розбиття вашої програми на підпрограми, що набагато простіше, ніж розбивши його на предмети. Ідея вашої основної програми - це короткий розпорядок, який викликає підпрограми ("методи" на Java) для виконання роботи. Кожна підпрограма знає лише те, що сказано за її параметрами. (Одним із цих параметрів може бути ім'я файлу, тому ви можете трохи обдурити.) Отже, переглядаючи заголовок підпрограми / методу, ви швидко розумієте, що він робить, робить майже з першого погляду.

Тоді всі підпрограми розбиваються аналогічно, поки кілька рядків коду без жодних викликів методів не виконають цю роботу. Основна програма, яка викликає кілька методів, кожен з яких викликає кілька методів, кожен з яких .... До невеликих простих методів, які виконують роботу. Таким чином ви можете подивитися на будь-яку частину дуже великої програми (або невеликої програми) і швидко зрозуміти, що вона робить.

Java спеціально розроблена для людей, які пишуть об'єктно-орієнтований код. Але навіть найінтенсивніша програма OO використовує деякі структуровані програми, і ви завжди можете підривати будь-яку мову. (Я робив OO в простому С.). Отже, ви можете робити SP або що-небудь ще в Java. Забудьте про заняття та зосередьтеся на великих методах, які можна розбити на маленькі, керовані. Варто додати, що SP дуже допомагає, коли ви можете повторно використовувати свій код, а також з принципом DRY (google it, але це означає "Не повторюйте себе").

Сподіваюся, я пояснив, чому і як розділити свій код на кілька частин, не вводячи "класи". Вони чудова ідея і є лише ділом для ігор, а Java - чудовою мовою для OOP. Але краще знати, чому ти робиш те, що робиш. Залиште OOP у спокої, поки він не почне мати певний сенс для вас.


0

Однією з переваг є повторне використання. Програма - це, як правило, куча інструкцій, згрупованих разом. Ви виявите, що деякі з цих інструкцій підходять і для інших програм.

Скажімо, ви робите гру в стрибки. Пізніше, коли ви вирішите зайнятися грою на гармати, ви виявите, що тут підходить обчислення фізики, яке ви використовували в грі з стрибками.

Тож замість того, щоб написати це ще раз, або ще гірше скопіювати та вставити його в нову програму, ви перетворите його в клас. Тож наступного разу, коли ви зробите іншу гру, де ігрова механіка вимагає фізики, ви можете її просто повторно використати. Звичайно, це спрощено, але я сподіваюся, що це має сенс.


0

Перш за все, зауважте, що я є C ++ та Python, а не Java, тому щось із цього може не застосовуватися так повно. Виправте мене, якщо я роблю кілька неправильних припущень щодо роботи класів на Java.

Заняття в першу чергу корисні при їх інстанції. Клас, з якого насправді не створюються жодні екземпляри, насправді є просто прославленим простором імен. Якщо ви використовуєте всі свої класи таким чином, то, справді, переваги переміщення речей із простору імен у простір імен можуть здатися незначними - якнайкраще, ви виграєте, маючи в кожному приватні дані і тим самим трохи інкапсулюючи речі.

Однак тут не світяться класи. Розглянемо Stringклас: ти можеш мати всі однакові функції, використовуючи charмасиви та деякі статичні функції. У цей момент функції дають вам трохи додаткової безпеки та синтаксичного цукру. Ви можете писати string.length()замість length(char_array); це не дуже велика справа, але багатьом все ще подобається. Крім того, ви знаєте, що якщо хтось дав вам String, він був створений за допомогою Stringконструктора і він повинен працювати з lengthфункцією - якщо версія масиву не може обробити якийсь символ, то це не може завадити вам помістити його туди .

Це все ще не все. Ключовим моментом є те, що класи об’єднують дані та функції, які працюють над ним та абстрагують їх обидва. Якщо у вас є метод, void f(Builder b)ви знаєте, що ви отримаєте Builder, і ви можете сподіватися, що він буде підтримувати певну поведінку. Однак ви нічого не знаєте про дані або функції, що виконуються - насправді, визначення обох можливо ще не написано під час написання та компіляції f.

Перший момент, який потрібно зрозуміти, полягає в тому, що класи дозволяють зручно обмінювати дані, переконуючись, що вони не порушені. Другий момент полягає в тому, що і те, які дані, і яку функцію (реалізацію) має об’єкт - це щось про об'єкт, а не те, що ви можете просто сказати з його типу.


0

Вся ідея заснована на загальному правилі під назвою ділити і перемагай .
Цю парадигму можна використовувати майже скрізь; Ви поділяєте проблему на менші проблеми, а потім вирішуєте ці маленькі, прості та добре відомі проблеми.
Поділ вашої програми на класи - це один із типів поділу, який став поширеним в останнє десятиліття. У цій парадигмі програмування ми моделюємо нашу проблему деякими об'єктами і намагаємося вирішити проблему, надсилаючи повідомлення між цими об'єктами.
Деякі люди можуть сказати, що такий підхід легше зрозуміти, розширити і налагодити.
Хоча деякі люди не згодні :)


0

Йдеться не про розділення програми на класи, а про те, як ви моделюєте свою програму, тобто про те, як ви візуалізуєте частини програми. Розбиття речей - це лише механізм, який ми використовуємо, щоб краще зрозуміти складні речі. Це не тільки з програмуванням. Уявіть друковану плату з безліччю проводів, переплетених один з одним, утворюючи складну структуру, де кожен провід десь з'єднується (код спагетті). Вам доведеться прослідкувати кожен провід до його кінця, щоб з’ясувати з'єднання. Навпаки, уявіть дроти, які групуються та кольорово кодуються відповідно до їх функції. Ставати набагато простіше виправити речі.

Ідея полягає в тому, що ви не починаєте з довгої програми, а потім розділяєте її на класи. Але ви спочатку моделюєте свою програму з точки зору об'єктів / класів, а потім підключаєте їх для створення додатків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.