Запахи коду

Код із запашком (код з душком, код, що погано пахне англ. code smell) — термін, що позначає код з ознаками (запахами) проблем в системі. Був введений Кентом Беком[1] і використаний Мартіном Фаулером в його книзі «Рефакторинг. Поліпшення існуючого коду»[2], з тих пір активно використовується розробниками ПЗ[3].

Запахи коду — це ключові ознаки необхідності рефакторингу[4]. Існують запахи, специфічні як для парадигм програмування, так і для конкретних мов. Основною проблемою, з якою стикаються розробники при боротьбі з запахами коду, є те, що критерії своєчасності рефакторингу неможливо чітко формалізувати без апеляції до естетики і умовного почуття прекрасного. Запахи коду — це не набір чітких правил, а опис місць, на які потрібно звертати увагу при рефакторингу[5]. Вони легко виявляються, але при цьому не у всіх випадках свідчать про проблеми[1].

Код із запашком веде до розпаду коду, розробники повинні прагнути до усунення запашку шляхом застосування одноразового або багаторазового рефакторинга[6]. У процесі рефакторингу відбувається позбавлення від запахів коду, що забезпечує можливість подальшого розвитку додатків з тією ж або більшою швидкістю. Відсутність регулярного рефакторинга з плином часу здатна повністю паралізувати проект, тому запахи коду необхідно усувати на ранніх стадіях[4]. Існують інструменти пошуку та виправлення запахів коду[7], проте досвід показує, що ніякі системи показників не можуть змагатися з людською інтуїцією, основаною на інформації[8].

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

Дослідження 2015 року з використанням автоматизованого аналізу півмільйона комітів і ручного обстеження 9,164 комітів встановило, що:

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

Запахи коду

Загальні запахи об'єктно-орієнтованого коду

Дублювання коду

Приклад триразового дублювання коду та позбавлення від цього запашку за допомогою виділення методу і наступних викликів коду створеного методу
Докладніше: Дублювання коду

Дублювання коду — це використання однакових структур коду в декількох місцях. Об'єднання цих структур дозволить поліпшити програмний код[8].

Приклади дублювання і методи їх усунення:

  • Один і той самий вираз, що присутній в двох методах одного і того ж класу, то необхідно застосувати «Відокремлення методу» (Extract Method) і викликати код створеного методу з обох точок;
  • Один і той самий вираз є в двох підкласах, що знаходяться на одному рівні: необхідно застосувати «Виділення методу» (Extract Method) для обох класів з подальшим «Підйомом поля» (Pull Up Field) або «Формуванням шаблону методу» (Form Template Method), якщо код схожий, але не збігається повністю. Якщо обидва методи роблять одне і те ж за допомогою різних алгоритмів, можна вибрати більш чіткий з цих алгоритмів і застосувати «Заміщення алгоритму» (Substitute Algorithm);
  • Дублювання коду знаходиться в двох різних класах: необхідно застосувати «Виділення класу» (Extract Class) в одному класі, а потім використовувати новий компонент в іншому[9].

Довгий метод

Серед об'єктних програм найдовше живуть програми з короткими методами. Чим довша процедура, тим важче її зрозуміти. Якщо у методу гарна назва, то не потрібно дивитися його тіло[5].

Слід дотримуватися евристичного правила: якщо відчувається необхідність щось прокоментувати, потрібно написати метод. Навіть один рядок має сенс виділити в метод, якщо він потребує роз'яснень[10].

  • Для скорочення методу досить застосувати «Виділення методу» (Extract Method);
  • Якщо локальні змінні і параметри перешкоджають виділенню методу, можна застосувати «Заміну тимчасової змінної викликом методу» (Replace Temp with Query), «Введення граничного об'єкту» (Introduce Parametr Object) і «Збереження всього об'єкта» (Preserve Whole Object)[5];
  • Умовні оператори і цикли свідчать про можливість виділення в окремий метод. Для роботи з умовними виразами підходить «Декомпозиція умовних операторів» (Decompose Conditional). Для роботи з циклом — «Виділення методу» (Extract Method)[10].

Великий клас

Коли клас реалізує занадто велику функціональність, варто подумати про винесення деякої частини коду в підклас. Це позбавить розробників від надмірної кількості наявних у класу атрибутів і дублювання коду[10].

  • Для зменшення класу використовується «Виділення класу» (Extract Class) або «Виділення підкласу» (Extract Subclass). При цьому слід звертати увагу на спільність у назві атрибутів і на те, чи використовує клас їх всі одночасно[5];
  • Якщо великий клас є класом GUI, може знадобитися переміщення його даних і поведінку в окремий об'єкт предметної області. При цьому може виявитися необхідним зберігати копії деяких даних у двох місцях і забезпечити їх узгодженість. «Дублювання видимих ​​даних» (Duplicate Observed Data) пропонує шлях, яким можна це здійснити[11].

Довгий список параметрів

У довгих списках параметрів важко розбиратися, вони стають суперечливими і складними у використанні. Використання об'єктів дозволяє, в разі зміни переданих даних, модифікувати тільки сам об'єкт. Працюючи з об'єктами, слід передавати рівно стільки, щоб метод міг отримати необхідні йому дані[11].

  • «Заміна параметра викликом методу» (Replace Parameter with Method) застосовується, коли можна отримати дані шляхом виклику методу об'єкта. Цей об'єкт може бути полем або іншим параметром.
  • «Збереження всього об'єкта» (Preserve Whole Object) дозволяє взяти групу даних, отриманих від об'єкта, і замінити їх цим об'єктом.
  • «Введення граничного об'єкта» (Introduce Parameter Object) застосовується, якщо є кілька елементів даних без логічного об'єкта[11].

Розбіжні модифікації

Проблема виникає, коли при модифікації в системі неможливо виділити певне місце, яке потрібно змінити. Це є наслідком поганої структурованості ПЗ або програмування методом копіювання-вставлення.

  • Якщо набір методів необхідно змінювати кожного разу при внесенні певних модифікацій в код, то застосовується «Виділення класу» (Extract Class) (Наприклад, три методи змінюються кожного разу коли підключається нова база даних, а чотири — при додаванні фінансового інструменту)[5].

Стрільба дробом

При виконанні будь-яких модифікацій доводиться вносити безліч дрібних змін у велике число класів. «Стрільба дробом» схожа на «Розбіжну модифікацію», але є її протилежністю. «Розбіжна модифікація» має сенс, коли є один клас, в якому проводиться багато різних змін, а «Стрільба дробом» — це одна зміна, що зачіпає багато класів[12].

  • Винести всі зміни в один клас дозволять «Переміщення методу» (Move Method) і «Переміщення поля» (Move Field);
  • Якщо немає відповідного класу, то слід створити новий клас;
  • Якщо це необхідно, слід скористатися «Вбудовуванням класу» (Inline Class)[5].

Заздрісні функції

Метод звертається до даних іншого об'єкта частіше, ніж до власних даних[5].

  • «Переміщення методу» (Move Method) застосовується, якщо метод явно слід перевести в інше місце;
  • «Виділення методу» (Extract Method) застосовується до частини методу, якщо тільки ця частина звертається до даних іншого об'єкта;
  • Метод використовує функції декількох класів: визначається, в якому класі знаходиться найбільше даних, і метод поміщається в клас разом з цими даними, або за допомогою «Виділення методу» (Extract Method) метод розбивається на кілька частин і вони поміщаються в різні місця.

Фундаментальне практичне правило говорить: «Те, що змінюється одночасно, треба зберігати в одному місці». Дані та функції, що використовують ці дані, які зазвичай змінюються разом, але бувають винятки[13].

Групи даних

Групи даних, що зустрічаються спільно, потрібно перетворювати в самостійний клас[13].

  • «Виділення методу» (Extract Method) використовується для полів;
  • «Введення граничного об'єкту» (Introduce Parameter Object) або «Збереження всього об'єкта» (Preserve Whole Object) для параметрів методів[14].

Хороша перевірка: видалити одне із значень даних і перевірити, чи збереже сенс решта. Якщо ні, то це вірна ознака того, що дані напрошуються на об'єднання їх в об'єкт[13].

Одержимість елементарними типами

Проблема пов'язана з використанням елементарних типів замість маленьких об'єктів для невеликих завдань, таких як валюта, діапазони, спеціальні рядки для телефонних номерів тощо

  • «Заміна значення даних об'єктом» (Replace Data Value with Object);
  • «Заміна масиву об'єктом» (Replace Array with Object);
  • Якщо це код типу, то використовуйте «Заміну коду типу класом» (Replace Type Code with Class), «Заміну коду типу підкласами» (Replace Type Code with Subclasses) або «Заміну коду типу станом / стратегією» (Replace Type Code with State / Strategy)[5].

Оператори типу switch

Одним з очевидних ознак об'єктно-орієнтованого коду служить порівняно рідкісне використання операторів типу switch (або case). Часто один і той же блок switch виявляється розкиданим по різних місцях програми. При додаванні в перемикач нового варіанту доводиться шукати всі ці блоки switch і модифікувати їх. Як правило, помітивши блок switch, слід подумати про поліморфізм[15].

  • Якщо switch перемикається по коду типу, то слід використовувати «Заміну коду типу підкласами» (Replace Type Code with Subclasses) або «Заміну коду типу станом / стратегією» (Replace Type Code with State / Strategy);
  • Може знадобитися «Виділення методу» (Extract Method) і «Переміщення методу» (Move Method) щоб ізолювати switch і помістити його в потрібний клас;
  • Після налаштування структури спадкування слід використовувати «Заміну умовного оператора поліморфізмом» (Replace Conditional with Polymorphism)[5].

Паралельні ієрархії успадкування

У коді з таким запашком щоразу при породженні підкласу, одного з класів, доводиться створювати підклас іншого класу[15].

  • Загальна стратегія усунення дублювання полягає в тому, щоб змусити екземпляри однієї ієрархії посилатися на екземпляри іншого ієрархії, а потім прибрати ієрархію в класі за допомогою «Переміщення методу» (Move Method) і «Переміщення поля» (Move Field)[15].

Лінивий клас

Клас, витрати на існування якого не окупаються виконуваними ним функціями, повинен бути ліквідований[15].

  • При наявності підкласів з недостатніми функціями спробуйте «Згортання ієрархії» (Collapse Hierarchy);
  • Майже даремні компоненти повинні підлягати «Вбудовуванню класу» (Inline Class)[15].

Теоретична спільність

Цей випадок виникає, коли на певному етапі існування програми забезпечується набір механізмів, який, можливо, буде потрібен для деякої майбутньої функціональності. У підсумку програму стає важче розуміти і супроводжувати[16].

  • Для незадіяних абстрактних класів використовуйте «Згортання ієрархії» (Collapse Hierarhy);
  • Непотрібна делегація може бути вилучена за допомогою «Вбудовування класу» (Inline Class);
  • Методи з невикористовуваними параметрами повинні підлягати «Видаленню параметрів» (Remove Parameter)[5].

Тимчасове поле

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

  • Тимчасові поля і весь код, який працює з ними, слід помістити в окремий клас за допомогою «Виділення класу» (Extract Class);
  • Видалити умовно код, що використовується, можна за допомогою «Введення об'єкта Null» (Introduce Null Object) для створення альтернативного компонента[16].

Ланцюжок викликів

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

  • Для видалення ланцюжка викликів застосовується прийом «Приховування делегування» (Hide Delegate)[16].

Посередник

Надмірне використання делегування може призвести до появи класів, у яких більшість методів складаються тільки з виклику методу іншого класу[16].

  • Якщо велику частину методів клас делегує іншого класу, потрібно скористатися «Видаленням посередника» (Remove Middle Man)[18].

Недоречна близькість

«Недоречна близькість» виникає тоді, коли класи частіше, ніж варто було б, занурені в закриті частини один одного[18].

  • Позбутися «недоречної близькості» можна за допомогою «Переміщення методу» (Move Method) й «Переміщення поля» (Move Field);
  • За можливістю слід вдатися до «Заміни двобічного зв'язку односпрямованим» (Change Bidirectional Association to Unidirectional), «Виділення класу» (Extract Class) або скористатися «Приховуванням делегування» (Hide Delegate)[18].

Альтернативні класи з різними інтерфейсами

Два класи, в яких частина функціональності загальна, але методи, що реалізують її, мають різні параметри[19].

  • Застосовуйте «Перейменування методу» (Rename Method) до всіх методів, які виконують однакові дії, але з різними сигнатурами[18].

Неповнота бібліотечного класу

Бібліотеки через деякий час перестають задовольняти вимогам користувачів. Природне рішення — змінити дещо в бібліотеках, але бібліотечні класи не змінювати. Слід використовувати методи рефакторінга, спеціально призначені для цієї мети[19].

  • Якщо треба додати пару методів, використовується «Запровадження зовнішнього методу» (Introduce Foreign Method);
  • Якщо треба серйозно поміняти поведінку класу, використовується «Введення локального розширення» (Introduce Local Extension)[19].

Класи даних

Класи даних — це класи, які містять тільки поля і методи для доступу до них, це просто контейнери для даних, що використовуються іншими класами[19].

  • Слід застосувати «Інкапсуляцію поля» (Encapsulate Field) й «Інкапсуляцію колекції» (Encapsulate Collection)[5].

Відмова від наслідування

Якщо спадкоємець використовує лише малу частину успадкованих методів і властивостей батька — це є ознакою неправильної ієрархії.

  • Необхідно створити новий клас на одному рівні з нащадком, і за допомогою «Спуска метода» (Push Down Method) і «Спуска поля» (Push Down Field) виштовхнути в нього всі недіючі методи. Завдяки цьому в батьківському класі буде міститися тільки те, що використовується спільно[20].

Коментарі

Часто коментарі грають роль «дезодоранту» коду, який з'являється в ньому лише тому, що код поганий. Відчувши потребу написати коментар, спробуйте змінити структуру коду так, щоб будь-які коментарі стали зайвими[20].

  • Якщо для пояснення дій блоку все ж потрібен коментар, спробуйте застосувати «Виділення методу» (Extract Method);
  • Якщо метод вже виділений, але як і раніше потрібен коментар для пояснення його дії, скористайтеся «Перейменування методу» (Rename Method);
  • Якщо потрібно викласти деякі правила, що стосуються необхідного стану системи, застосуйте «Введення затвердження» (Introduce Assertion)[20].

Див. також

Примітки

Література

Посилання

  • Рефакторинг коду. refactoring.guru. Архів оригіналу за 10 вересня 2016. Процитовано 28 липня 2016.
  • Запахи коду. refactoring.guru. Архів оригіналу за 11 вересня 2016. Процитовано 28 липня 2016.
  • CodeSmell. Martinfowler.com. Архів оригіналу за 18 квітня 2015. Процитовано 13 жовтня 2013.
  • Запахи поганого коду. Vihv.org. Архів оригіналу за 9 грудня 2013. Процитовано 13 жовтня 2013.
  • Code Smell. Cunningham & Cunningham, Inc. (c2.com). Архів оригіналу за 2 грудня 2013. Процитовано 23 листопада 2013.

Read other articles:

Samui Internasional AirportLapangan Terbang Antarabangsa SamuiBandar Udara Internasional SamuiทําอากาศยามมามาชาดิสมุยIATA: USMICAO: VTSM USMLokasi Bandar Udara di ThailandInformasiJenissipilPengelolaBangkok AirwaysLokasiNa Thon, Koh SamuiZona waktuUTC+7Koordinat{{{coordinates}}} Bandar Udara Samui Bandar Udara Samui (IATA:USM ICAO:VTSM) adalah bandara yang bersifat pribadi yang terletak di pulau Koh Samui, Thailand. Lokasi bandara terletak 2 ...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Oktober 2022. Pontificio Sant'Anselmo yang terletak di Roma, Italia Anselmianum, juga dikenal sebagai Athenaeum Kepausan Santo Anselm (Italia: Pontificio Ateneo Sant'Anselmocode: it is deprecated ; Latin: Pontificium Athenaeum Anselmianumcode: la is deprecated ) ada...

 

Dewan Perwakilan Rakyat DaerahKota ParepareDewan Perwakilan Rakyat Daerah Kota Parepare 2019–2024JenisJenisUnikameral Jangka waktu5 tahunSejarahSesi baru dimulai2 September 2019PimpinanKetuaKaharuddin Kadir (Golkar) sejak 27 Desember 2022 Wakil Ketua ITasming Hamid (NasDem) sejak 9 Oktober 2019 Wakil Ketua IIRahmat Sjamsu Alam (Demokrat) sejak 9 Oktober 2019 KomposisiAnggota25Partai & kursi  PKB (1)   Gerindra (3)   PDI-P (2)   Golkar ...

В виде знаков (1966—1968), и в виде медалей (1968—1990). медали (1968—1990). Знак резервиста Национальной народной армии (нем. Reservistenabzeichen der Nationalen Volksarmee) — ведомственная награда в ГДР для резервистов ННА. История Знак резервиста Национальной народной армии (ННА) учреждён начальни...

 

Ne doit pas être confondu avec Enfant soldat. Camp de réfugiés Amam en 2009. Les enfants dans les situations d'urgence et de conflit connaissent des risques pour leur santé, leur sécurité et leur bien-être. Il existe différents types de conflits et d'urgence, par exemple la violence, le conflit armé, la guerre, les désastres naturels, etc. Lorsque le conflit violent devient la norme, les jeunes enfants voient leur existence profondément bouleversée, tandis que leurs familles ont ...

 

Medali KepeloporanTipeTanda jasaNegara IndonesiaDipersembahkan olehPresiden IndonesiaStatusMasih dianugerahkanDidirikan2009Diberikan perdana2011Diberikan terakhir2020Pita tanda jasa KeutamaanSetaraMedali KejayaanMedali Perdamaian Medali Kepeloporan adalah tanda jasa yang diberikan oleh Presiden Republik Indonesia. Medali Kepeloporan diberikan kepada seorang perintis, penemu, maupun pengembang suatu karya atau bidang yang bermanfaat bagi bangsa, negara, dan pembangunan Indonesia.[1 ...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Yuknoom Chʼeen II – news · newspapers · books · scholar · JSTOR (December 2016) (Learn how and when to remove this template message) Ajaw Yuknoom Che'en IIAjawFunerary mask of Yuknoom Ch'een IIKing of CalakmulReign1 May 636 - 686PredecessorYuknoom HeadSuccesso...

 

.pw

.pwDiperkenalkan12 Juni 1997Jenis TLDtop-level domain kode negaraStatusAktifRegistri PW Registry (registrasi) CentralNic (operator teknis registrasi) SponsorMicronesia Investment and Development CorporationPemakaian yang diinginkanEntitas yang berhubungan dengan  PalauPemakaian aktualRuang nama yang didedikasikan untuk penggunaan sebagai identitas profesional di web; dapat digunakan oleh semua orang dan digunakan untuk tujuan apapunPembatasanTak adaStrukturRegistrasi dapat dilakukan lang...

 

Wayne GardnerAMWayne Gardner di GP Jepang 1989KebangsaanAustraliaLahir11 Oktober 1959 (umur 64)Wollongong, Australia Catatan statistik Karier Grand Prix Sepeda MotorTahun aktif1983–1992 Lomba pertamaDutch TT 500cc 1983Menang pertamaGrand Prix Spanyol 500cc 1986Menang terakhirGrand Prix Inggris 500cc 1992Lomba terakhirGrand Prix Afrika Selatan 500cc 1992TimHondaJuara dunia500cc – 1987 Start Menang Podium Pole F. lap Poin 102 18 51 19 19 1074 Wayne Michael Gardner AM[1] (lahir ...

此条目序言章节没有充分总结全文内容要点。 (2019年3月21日)请考虑扩充序言,清晰概述条目所有重點。请在条目的讨论页讨论此问题。 哈萨克斯坦總統哈薩克總統旗現任Қасым-Жомарт Кемелұлы Тоқаев卡瑟姆若马尔特·托卡耶夫自2019年3月20日在任任期7年首任努尔苏丹·纳扎尔巴耶夫设立1990年4月24日(哈薩克蘇維埃社會主義共和國總統) 哈萨克斯坦 哈萨克斯坦政府...

 

Questa voce o sezione sull'argomento personaggi dei fumetti non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. PolarisDisegni di Salvador Larroca UniversoUniverso Marvel Nome orig.Polaris Lingua orig.Inglese AutoriArnold Drake Jim Steranko EditoreMarvel Comics 1ª app.ottobre 1968 1ª app. ...

 

Терраформированный Меркурий, в представлении художника Меркурий является одним из кандидатов для колонизации в пределах Солнечной системы наряду с Марсом, Венерой, Луной, Церерой, Европой, Ганимедом, Каллисто, Титаном. Содержание 1 Преимущества 1.1 Сходство с Луной 1.2 Лёд ...

Modelling of a fold and thrust belt in a sand box A fold and thrust belt (FTB) is a series of mountainous foothills adjacent to an orogenic belt, which forms due to contractional tectonics. Fold and thrust belts commonly form in the forelands adjacent to major orogens as deformation propagates outwards. Fold and thrust belts usually comprise both folds and thrust faults, commonly interrelated. They are commonly also known as thrust-and-fold belts, or simply thrust-fold belts. Geometry Fold an...

 

Carl Tausig Carl (atau Karl) Tausig (lahir 4 November 1841 – ; meinggal 17 Juli 1871) adalah seorang komponis dan pianis kenamaan bangsa Polandia.[1] Ia pernah menjadi murid dari Franz Liszt.[1] Ia merupakan pemain piano yang nyaris tanpa melakukan kesalahan, kemahirannya sangat terkenal.[1] Ia mengasah bakat bermain piano dengan lebih profesional dalam buku karangan Clementi berjudul Gradus ad Parnassum.[1] Riwayat Hidup Ringkas Tausig menerima ...

 

Public university in Harbin, Heilongjiang, China Not to be confused with Harbin Engineering University or Harbin University of Science and Technology. Harbin Institute of Technology哈尔滨工业大学Motto规格严格,功夫到家Motto in EnglishRigor and MasteryTypePublicEstablished1920; 104 years ago (1920)PresidentHan JiecaiAcademic staff2,957Undergraduates25,002Postgraduates12,710Location Harbin, Heilongjiang Weihai, Shandong Shenzhen, Guangdong Campus1,060.823 ...

Pour les articles homonymes, voir Dix-Février. Éphémérides Février 1er 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29             10 janvier 10 mars Chronologies thématiques Croisades Ferroviaires Sports Disney Anarchisme Catholicisme Abréviations / Voir aussi (° 1852) = né en 1852 († 1885) = mort en 1885 a.s. = calendrier julien n.s. = calendrier grégorien Calendrier Calendrier perpétuel Liste de calendriers Naissances ...

 

Market building of the Roman colony of Puteoli, now the city of Pozzuoli in southern Italy Frontispiece of Charles Lyell's Principles of Geology of 1830, carefully reduced from that given by the Canonico Andrea de Jorio in his Ricerche sul Tempio di Serapide, in Puzzuoli. Napoli, 1820,[1] which had been based on a drawing by John Izard Middleton. The Macellum of Pozzuoli (Italian: Macellum di Pozzuoli) was the macellum or market building of the Roman colony of Puteoli, now the city of...

 

古埃及宗教(Ancient Egyptian religion)是由一套复杂的多神教信仰和宗教仪式所构成的古埃及的宗教,它是古埃及社会不可或缺的一部分。其他宗教信仰者将其视为埃及神话。 古埃及人认为有许多神存在于世且这些神能控制世界,人们需要通过祈祷和献祭来获得祂们的庇佑。正式的宗教实践以法老为中心,他们是人民和众神的中介,有义务向众神祭祀和献祭来维持他们的玛亚特...

Bruciatore di una cucina a gas. Un bruciatore è un componente di un impianto di combustione, in cui avviene la miscelazione di un combustibile ed un comburente, e successivamente la reazione di combustione iniziata da un innesco, generalmente con produzione di fiamma (esiste anche una particolare combustione denominata flame-less, cioè senza fiamma[1]). Indice 1 Classificazione 2 Funzionamento 2.1 Ciclo di accensione 2.2 Controllo della presenza della fiamma 2.2.1 Sensori a ionizzaz...

 

Pour les articles homonymes, voir Villeneuve. Villeneuve-d'Ascq Le château de Flers, en hiver. Héraldique Administration Pays France Région Hauts-de-France Département Nord Arrondissement Lille Intercommunalité Métropole européenne de Lille Maire Mandat Gérard Caudron 2020-2026 Code postal 59491, 59493, 59650 Code commune 59009 Démographie Gentilé Villeneuvois Populationmunicipale 62 067 hab. (2021 ) Densité 2 260 hab./km2 Population agglomération 1 058&#...