Чи є конструктор рутинним?

В даний час ми пишемо нашу бакалаврську дисертацію про впровадження компілятора для навчальної об'єктно-орієнтованої мови програмування.

Ми хочемо бути точними в нашій документації, і ми зараз обговорюємо, чи конструктор є рутинним.

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

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

Ми не впевнені, чи це питання має чітку відповідь, або якщо визначення відрізняється від теорії до теорії.

Ми були б щасливі, якщо б хтось міг дати вказівку на якусь літературу про це семантичне питання.

Найкраще

Редагування: деякі відомості про те, як ми називаємо конкретні речі в нашій мові:

  • We have functions and procedures. Functions do have a return value, procedures don't.
  • A constructor is like an unnamed procedure (without explicit return value)
  • a constructor is called implicit, java like: x := new X(1, new Y())
  • Parameters are defined during the definition of a constructor. The own instance (this) is not considered a parameter but provided implicitly

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

2
Якщо це питання "незрозуміло", то яке питання не залишається неясним?
додано Автор sharptooth, джерело
Це може бути кращим питанням для Інженерії програмного забезпечення
додано Автор John Saunders, джерело
Там є багато можливостей для інтерпретації: я кажу, що конструктор має назву, але не повертає тип. Ім'я конструктора має бути таким самим, як ім'я класу :-)
додано Автор Thorsten Dittmar, джерело
Конструктор - це звичайна програма вашої мови, якщо ви визначите її як таку. Все залежить від того, що ви вкладете у свої специфікації.
додано Автор Aleph, джерело
Ну, на нашій мові це не має назви, окрім власного ключового слова (constr, ми тут не були творчими). Вона не має типу повернення.
додано Автор charno, джерело

6 Відповіді

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

2
додано

Конструктор - конструктор.

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

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

Якщо ви хочете запитати про таке, спочатку опишіть/визначте свою мову та всі ваші терміни, які ви хочете використати (який метод class? Method? Function? Routine? Parameter? Constructor? ...), а потім, ну, більшість ймовірно, ви автоматично виведете відповідь, що відповідає вашій онтології.

2
додано
Що ж, я б сказав, що цей є параметром, тому що в іншому випадку, як конструктор знає, до якого прикладу він застосовується?
додано Автор sharptooth, джерело
достатньо для того, щоб мати багато рецензованих ресурсів, де ви знайдете гарні умови для використання/refer/link/quote/etc. "Інтернет" є слабким середовищем для публікацій. Навряд чи можна цитувати "StackOverflow, питання 213123" як посилання в бібліографії;)
додано Автор quetzalcoatl, джерело
@ Christof: добре .. так. Ви мене зовсім правильно. Я розумію, що ви хочете бути правильними у вашій роботі, але стикаючись з реальним світом, людьми та лінгвістикою/формалізмом, це сильно залежить від того, з ким ви працюєте і хто це буде перевіряти. Ви працюєте в деяких середовищах, і вам, можливо, доведеться дотримуватися їх термінології або визначити свою власну. Незалежно від розумності або невідповідності, яке ви знайдете тут, неодмінно подвійно перевірте у місцевих професорів ..
додано Автор quetzalcoatl, джерело
Дякую за вашу відповідь. Ви можете знайти деяку оновлену інформацію в редагуванні питання, але я думаю, що ви дійсно хочете сказати нам, що ми повинні самостійно вирішити.
додано Автор charno, джерело

This depends on language - and for this academic language - I would not say that a constructor is a routine. I say that because in not saying that it is a routine, a separation is kept: unless the language explicitly unifies routines/functions/constructors, don't say it does :)

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

  • Такі мови, як Ейфелеві, дозволяють давати конструкторам різні назви (які, на мою думку, чудово, а бажання було використано більше).
  • Такі мови, як Ruby, не мають "нового" оператора, і виклик конструктора з'являється як виклик будь-якого (класу) методу. ruby навіть не має способу сигналізувати, що метод виступає як конструктор (або заводський метод, як і раніше).
  • Конструктори в таких мовах, як JavaScript, - це лише функції, які можуть бути запущені у спеціальному контексті, коли вони використовуються з new .

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

Тобто, розглядаючи наступний код, чи використовується конструктор?

5 4 vec2 "1" int 2 vec2 add puts

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

Тепер, напишіть специфікацію мови як прийнятну і спробуйте уникнути витоку деталей виконання .

2
додано
Що стосується Ruby, то пари XClass.new і initіize() , які мають ідіоматичні значення "createit" та "initializeme", автоматично доступні для будь-якого класу, якщо ви ніяк не перевизначите їх . Це ідеально схоже на новий оператор і конструктор, просто настраиваемый;)
додано Автор quetzalcoatl, джерело
@ Christof Почніть з найменших обіцянок та найбільш концептуальних розрізнень (даючи кожному терміну окреме значення) і постійно вдосконалюйте його, як розвивається мова. Найчастіше простіше узагальнити два поняття (якщо вони в кінцевому підсумку є підходящим чином загальним), ніж спробувати розгадати два різних поняття, що мають однакове ім'я.
додано Автор user2246674, джерело
Так, я думаю, що якщо ми вирішимо назвати конвенцію в нашому документі, дуже важливо зробити це ясним, наскільки це можливо. Ми збираємося написати документ з мовного дизайну (з думками, що стоять за дизайном), а потім специфікацію мови (яка має специфіку виконання, оскільки ми збираємося змішувати граматику, контекстні обмеження та генерацію коду.
додано Автор charno, джерело

Ззовні конструктор можна розглядати як метод класу, причому екземпляр цього класу як повернення значення. Наскільки стверджується, що "він може використовуватися лише один раз для кожного екземпляра" не містить води, оскільки ще не існує примірника, коли використовується конструктор.

Зсередини деяке спеціальне ім'я keywordish, яке називається "це", пов'язано з неініціалізованим екземпляром.

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

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

BTW, "рутинна", встановлений термін в ООП?

1
додано
На routine : я думаю, OOP визначає лише "методи". Я насправді сумніваюсь, що абстрактний ООП взагалі розглядається як "конструктор". Я думаю, що він просто працює над створенням, знищенням та відправкою повідомлень (a.k.a call, invoke) умовами.
додано Автор quetzalcoatl, джерело

Конструктор (як у назві) виконує лише компілятор при створенні нового екземпляра цього класу.

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

1
додано
Так, це я мав на увазі .. Конструктор виконується тільки тоді, коли створюється об'єкт, або, іншими словами, виконується екземпляр цього класу ..
додано Автор now he who must not be named., джерело
Насправді, ви створюєте об'єкт (це означає, що конструктор виконується автоматично). Ви насправді не називаєте це, як інші методи в своєму класі. Припустимо, що у вас є тестовий метод в X, ви виконуєте об'єктив.Xtesttesthod (), але в аналогічному режимі ви не можете робити конструктор, такий як objtofX.X() недійсний ..
додано Автор now he who must not be named., джерело
@downvoter: турбота про пояснення?
додано Автор now he who must not be named., джерело
@ Christof: добре. Отже, чому пониження? Я все ще не можу зрозуміти, що в моїй відповіді не так
додано Автор now he who must not be named., джерело
Знизько, може, прийшов хтось. Не тільки автор питання (Христоф) може понизити. Майже будь-який користувач SO може знизити. Хтось не погодився з вашим описом і понизив його. Жаль, що він не залишив коментар. Ймовірно, він ніколи не буде передивлятися. Просто буває.
додано Автор quetzalcoatl, джерело
Так, це саме те, що я маю на увазі, що не можна називати конструктора більше одного разу. Наша компіляційна ціль - це JVM, тому ми спочатку створюємо новий екземпляр об'єкта (резервна пам'ять), а потім називаємо конструктор на рівні VM. На рівні мови програмування ці два етапи стискуються в один.
додано Автор charno, джерело
Ага? Конструктор не виконується компілятором, але в режимі виконання, коли створюється новий екземпляр об'єкта. x = new X() - це приклад для виклику конструктора під час виконання програми.
додано Автор charno, джерело

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

  • Конструктор допомагає лише в конструюванні та ініціалізації класу об'єкт та його змінні.
  • Він може або не може приймати параметри, це може бути перевантажено інший набір параметрів
  • Якщо конструктор не має параметрів, а також немає коду всередині його коду блок, ви можете пропустити його
  • Деякі мови автоматично створюють параметри за замовчуванням за замовчуванням конструктор (наприклад, C #), якщо ви не надасте свій власний конструктор
  • Конструктор може мати модифікатор доступу, щоб обмежити створення обсяг класу
  • Конструктор не може мати тип повернення, тому що його конструювання той самий клас, в якому він оголошений, і, очевидно, немає сенсу повернення того ж типу (можливо, саме тому деякі мови використовують ім'я конструктора як ім'я класу)
  • Всі правила виконання конструктора відрізняються від мови до мови
  • Крім того, вимога найбільш важливої ​​ добре написаного конструктора полягає в тому, що після виконання, він повинен залишити об'єкт класу в дійсному стані
1
додано
Гаразд, припустимо, у вас є бінарний оператор + , перевантажений у C ++ і реалізований як функція, що самостійно працює. Викликає цю функцію потрібним користувачем, який викликає, коли користувачеві просто належить написати A + B і A і B бувають типи, які відповідають підпису функції?
додано Автор sharptooth, джерело
@ Christof, VS1: " найважливіша " річ, яку ви включили, є дуже неправильною на багатьох мовах. Якщо конструктор приймає деякі параметри, як би цей конструктор припинив і повідомив про невдачу , коли параметри явно неправильні? На багатьох мовах конструктору суворо вимагається кинути , оскільки немає способу "повертати код помилки" або навіть "повертати нуль" замість явно готового до використання об'єкта-об'єкта ! Можливо, ви мали на увазі щось інше? Будь ласка, перегляньте останнє речення.
додано Автор quetzalcoatl, джерело
@ Christoff: "дійсний стан" сам по собі неоднозначний термін. Що це означає? Якщо у мене є клас "HeightOfAPerson", то якщо конструктор автоматично ініціалізує цей об'єкт із значенням ZERO (стандартне значення int// double), то він залишає об'єкт у "дійсному стані"? Я знаю, що ви мали на увазі "державу" в сенсі нижчого рівня, я намагаюся вказати на можливі непорозуміння. Конструктор не повинен ініціалізувати всі поля. І.е. див. 2-фазну конструкцію. Конструктор повинен налаштувати всі внутрішні та невидимі речі , як vtables або прапорці статусу GC ..
додано Автор quetzalcoatl, джерело
@ Christof: (1) з параметричними керами, повідомлення про помилки від ctors не призводять до постійного використання двофазної конструкції, де в другому етапі ви можете повідомити про помилку. IMHO, якщо ctor не дозволяє збій, тоді ви можете почати видаляти параметричні конструктори з специфікації lang. (2) існують "винятки" та "винятки". За винятками "runtime" ви можете мати на увазі технічні рівні або просто повідомлення про помилку, викинуті користувальницьким кодом, який також називається "runtime", оскільки вони трапляються під час виконання, або тому, що людина працювала в Java, де існувала непристойна RuntimeException клас ..
додано Автор quetzalcoatl, джерело
Я сподіваюся, ви добре продумали свою специфікацію, і ви будете обережні з визначеннями. Я "гуляю", тому що я/ми починаємо віддалятися від основного питання і подальшого. Удачі!
додано Автор quetzalcoatl, джерело
Ці твердження зовсім не вірні, ось лише кілька спростувань: конструктори дійсно можуть мати різні типи повернення. Конструктор не повинен підтримувати модифікацію доступу. Конструктор (або мова) не повинен підтримувати перевантаження.
додано Автор user2246674, джерело
Удачі @ Christof
додано Автор VS1, джерело
Спасибі @ Christof Я виправив мою відповідь.
додано Автор VS1, джерело
Спасибо @Quetzalcoatl Я оновив моє останнє речення, я повністю забув про невірні параметри, які, якщо вони будуть відіслані, конструктор повинен кинути виняток ..
додано Автор VS1, джерело
Велике спасибі за вашу допомогу! Впровадження генерації коду вже завершено, і приклади програм (наприклад, пов'язаний список) компілюються і працюють нормально. Наразі ми переглядаємо та перефразруємо ті дизайнерські рішення, які ми давно зробили для документації та останніх частин контекстних обмежень. З тих пір все працює нормально, і вимірювання з багатьох думок ми вкладаємо в специфікації, я думаю, що специфікація повинна бути, принаймні, добре.
додано Автор charno, джерело
@ketzalcoatl, ви маєте рацію, що це недійсне для всіх мов програмування (наприклад, у Java ви можете мати ще неініціалізовані поля після конструктора), але в нашому особливій справі необхідно ініціалізувати кожен поле класу. Я б стверджував, що в Java це дійсний стан екземпляра, щоб мати неініціалізовані поля. Звичайно, мова йде про технічний стан, а не про перевірку самих цінностей. Ми не дозволимо конструктору вийти з ладу, і ми не застосовуємо винятки для виконання runtime (за винятком розділених на нуль, що призводить до абортів програми)
додано Автор charno, джерело
Конструктор не викликається компілятором, але під час виконання. Більшість атрибутів, які ви написали, правильні для нашої мови, особливо для дійсного стану (ми не маємо нульових посилань на нашій мові, кожен конструктор класу повинен ініціалізувати всі поля).
додано Автор charno, джерело