Што такое прынцыпы SOLID?
Што такое прынцып адзінай адказнасці (SRP):
У класа павінна быць толькі адна адказнасць.
Для змены павінна быць толькі адна прычына.
Перавагі ўключаюць прасцейшае тэсціраванне, меншую сувязь і лепшую арганізацыю.
прыклад:
Java
публічная кніга класа {
прыватнае імя радка;
аўтар прыватнага радка;
прыватны радковы тэкст;
// канструктары, гетэры і сетэры
}
Што такое адкрыта-закрыты прынцып (OCP):
Праграмныя аб'екты AbOZYX0 (класы, модулі, функцыі) павінны быць адкрыты для пашырэння, але зачыненыя для мадыфікацыі.
Дасягнуць гэтага можна з дапамогай інтэрфейсаў, абстрактных класаў і спадчыны.
прыклад:
Java
Форма інтэрфейсу {
двайная плошча();
}
class Circle implements Shape { /* рэалізацыя / } клас Rectangle рэалізуе форму { / рэалізацыя */}
Што такое прынцып замены Ліскова (LSP):
Падтыпы павінны быць замяняльнымі на свае базавыя тыпы без змены карэктнасці праграмы.
Прытрыдзяецца работы “ёсць-ёсцц”.
прыклад:
Java
class Bird { /* звычайныя паводзіны птушак / } клас Sparrow пашырае Bird { / канкрэтныя паводзіны verb’ya */ }
Што такое прынцып падзелу інтэрфейсу (ISP):
Кліенты не павінны быць вымушаныя залежаць ад інтэрфейсаў, якімі яны не карыстаюцца.
Падзяліце вялікія інтэрфейсы на меншыя, больш канкрэтныя.
прыклад:
Java
інтэрфейс Worker {
пустая праца();
}
Пажыральнік інтэрфейсу {
несапраўднае ёсць ();
}
class Robot implements Worker { /* рэалізацыя */ }
Што такое прынцып інверсіі залежнасцей (DIP):
Модулі высокага ўзроўню не павінны залежаць ад модуляў нізкага ўзроўню; абодва павінны залежаць ад абстракцый.
Абстракцыі не павінны залежаць ад дэталяў; дэталі павінны залежаць ад абстракцый.
// Абстракцыя
інтэрфейс MessageSender {
несапраўдны sendMessage(радок паведамлення);
}
// Модуль высокага ўзроўню
клас NotificationService {
прыватны MessageSender messageSender;
public NotificationService(MessageSender messageSender) { this.messageSender = messageSender;}public void send(String message) { messageSender.sendMessage(message);}
}
// Модуль нізкага ўзроўню
клас EmailSender рэалізуе MessageSender {
@Override
public void sendMessage(String message) {
System.out.println(“EАдправіць электронную пошту: ” + паведамленне);
}
}
// Яшчэ адзін модуль нізкага ўзроўню
клас SmsSender рэалізуе MessageSender {
@Override
public void sendMessage(String message) {
System.out.println(“Адпраўка SMS: ” + паведамленне);
}
}
// Асноўны клас
публічны клас Main {
public static void main(String[] args) {
// Выкарыстоўвайце EmailSender
MessageSender emailSender = новы EmailSender();
NotificationService notificationService1 = новы NotificationService(emailSender);
notificationService1.send(“Прывітанне па электроннай пошце!”);
// Use SmsSender
MessageSender smsSender = new SmsSender();
NotificationService notificationService2 = new NotificationService(smsSender);
notificationService2.send("Hello via SMS!");
}
}
Інтэрфейс MessageSender служыць абстракцыяй.
Высокаўзроўневы модуль NotificationService залежыць ад гэтай абстракцыі замест канкрэтных рэалізацый.
Модулі нізкага ўзроўню, такія як EmailSender і SmsSender, таксама залежаць ад абстракцыі, рэалізуючы інтэрфейс MessageSender.
Што такое нармалізацыя SQL
Што такое нармалізацыя?
Нармалізацыя прадугледжвае структураванне даных у рэляцыйнай базе дадзеных для ліквідацыі анамалій, такіх як празмернасць.
Ён разбівае вялікія складаныя табліцы на больш дробныя, захоўваючы ўзаемасувязь даных.
Чаму нармалізацыя важная?
Памяншае надмернасць: разбіваючы дадзеныя на меншыя табліцы, мы пазбягаем шматразовага захоўвання адной і той жа інфармацыі.
Паляпшае прадукцыйнасць запытаў: меншыя нармалізаваныя табліцы прыводзяць да больш хуткага выканання запытаў.
Зводзіць да мінімуму анамаліі абнаўлення: абнаўленні можна рабіць, не закранаючы іншыя запісы.
Павышае цэласнасць даных: забяспечвае паслядоўныя і дакладныя даныя.
Сцэнары нармалізацыі:
Цэласнасць даных: прадухіленне неадпаведнасці пры абнаўленні даных (напрыклад, змены ўзросту кліента).
Эфектыўнае запытванне: спрашчайце складаныя запыты, разбіваючы дадзеныя.
Аптымізацыя сховішча: выключыце лішняе, каб зэканоміць месца.
Што такое маналіт Microservices?
Што такое маналіт?
Маналітнае прыкладанне будуецца як адзінае адзінае цэлае. Ён цесна спалучае ўсе кампаненты (напрыклад, карыстальніцкі інтэрфейс на баку кліента, базу дадзеных і сервернае прыкладанне) у адну кодавую базу.
Перавагі:
Лёгкае разгортванне: паколькі гэта адзін выканальны файл або каталог, разгортванне простае.
Хуткасць распрацоўкі: на ранніх этапах жыцця праекта маналіты дазваляюць хутка развівацца дзякуючы сваёй прастаце.
Прадукцыйнасць: цэнтралізаваны код можа апрацоўваць розныя функцыі.
Што такое мікрасэрвісы?
Мікрасэрвісы разбіваюць прыкладанне на больш дробныя службы, якія можна разгортваць незалежна. Кожная служба арыентавана на пэўны бізнес-дамен.
Перавагі:
Маштабаванасць: мікрасэрвісы дазваляюць самастойна маштабаваць асобныя кампаненты.
Гнуткасць: Распрацоўшчыкі могуць выбіраць розныя тэхналогіі для кожнай службы.
Ізаляцыя: збоі ў адной службе не ўплываюць на іншыя.
Праблемы:
Складанасць: кіраванне некалькімі сэрвісамі патрабуе надзейнай аркестроўкі.
Накладныя выдаткі на сетку: сувязь паміж службамі выклікае затрымку.
Складанасць разгортвання: каардынацыя абнаўленняў паміж службамі можа быць складанай.
Што такое палімарфізм?
Перавызначэнне метаду:
Калі падклас забяспечвае пэўную рэалізацыю для метаду, які ўжо вызначаны ў яго суперклассе.
Перагрузка метаду:
Калі клас мае некалькі метадаў з аднолькавым імем, але рознымі параметрамі (розная колькасць або тыпы аргументаў).
Для чаго выкарыстоўваюцца прыватныя канструктары?
–Private канструктары выкарыстоўваюцца ў дапаможных класах або канстантных класах.
Гэтыя класы ўтрымліваюць толькі статычныя метады або члены.
–Escape падкласы
Канструктар дэлегавання —:
Прыватныя канструктары дазваляюць дэлегаваць канструктар, калі пэўныя канструктары выклікаюць агульны прыватны канструктар.
— Шаблон Singleton
Пра JVM
Кампіляцыя —:
Калі вы кампілюеце файл .java, кампілятар Java стварае файлы .class, якія змяшчаюць байт-код (прамежкавае прадстаўленне).
Байт-код не залежыць ад платформы і можа працаваць у любой сістэме з сумяшчальнай JVM.
Падсістэма загрузніка класаў –:
Адказвае за загрузку класаў у памяць.
Чытае файлы .class, стварае двайковыя дадзеныя і захоўвае іх у вобласці метадаў.
Стварае аб'ект Class, які прадстаўляе загружаны клас у кучы памяці.
Прыклад: Student s1 = new Student(); Клас c1 = s1.getClass();
–Даведка:
Складаецца з трох этапаў:
Праверка: гарантуе правільнасць файла .class.
Падрыхтоўка: выдзяляе памяць для зменных класа і ініцыялізуе іх.
Раздзяленне (неабавязкова): Раздзяляе сімвалічныя спасылкі на іншыя класы або метады.
–Ініцыялізацыя:
Выконвае статычныя ініцыялізатары (напрыклад, статычныя блокі) і ініцыялізуе статычныя зменныя.
Зменныя асобніка ініцыялізуюцца пры стварэнні аб'екта.
–Execution Engine:
Пераўтварае байт-код у машынны код.
Уключае кампіляцыю Just-In-Time (JIT) для аптымізацыі прадукцыйнасці.
–Увогуле, JVM дазваляе праграмам Java працаваць дзе заўгодна, інтэрпрэтуючы байт-код і кіруючы памяццю.
Што такое абстрактны метад Прыват?
–Выкарыстанне прыватных метадаў у абстрактных класах:
Хоць абстрактныя метады не могуць быць прыватнымі, вы можаце выкарыстоўваць прыватныя метады ў абстрактным класе для розных мэтаў:
–Карысныя метады: рэалізаваць агульную функцыянальнасць, якую падзяляюць іншыя метады.
–Eкапсуляцыя: схаваць дэталі рэалізацый і падкласаў.
–Struct-like Classes: стварайце невялікія класы з прыватнымі метадамі, якія служаць кантэйнерамі дадзеных
Што такое зборшчык смецця?
–Успаміны:
Аб'екты AbOZYX0Java ствараюцца ў кучы, спецыяльнай вобласці памяці.
Некаторыя аб'екты становяцца недасяжнымі (праграма больш не спасылаецца на іх).
–Зборшчык смецця (GC):
GC вызначае і выдаляе невыкарыстоўваныя аб'екты, каб вызваліць памяць.
Ён працуе аўтаматычна ў фонавым рэжыме.
Два тыпу:
Малы GC: выдаляе недасяжныя аб'екты ў маладога пакалення.
Базавы GC (Поўны GC): ачышчае abs’ekts старога пакалення.
–Трансферы:
Распрацоўшчыкам не трэба відавочна выдаляць аб'екты.
GC забяспечвае даступнасць памяці і прадухіляе OutOfMemoryErrors
Што такое ААП?
Чатыры прынцыпу ААП:
–Ecapsulation: ab’adding даных (атрыбутаў) і метададзеных (функцый) разам у класе, каб схаваць дэталі рэалізацыі і забяспечыць чысты інтэрфейс.
–Inheritance: Стварэнне новых класаў на аснове існуючых, успадкоўванне іх атрыбутаў і паводзін. Гэта палягчае паўторнае выкарыстанне кода.
–Палімарфізм: дазваляе аднолькава апрацоўваць аб'екты розных класаў праз агульны інтэрфейс. Гэта забяспечвае гнуткасць і пашыральнасць.
–Aабстракцыя: Засяроджванне ўвагі на галоўных асаблівасцях, хаваючы непатрэбныя складанасці. Абстракцыя спрашчае дызайн і робіць яго больш кіраваным.
Што такое ACID ўласцівасці гуляюць вырашальную ролю ў забеспячэнні надзейнасці і паслядоўнасці транзакцый.
–Aтамарнасць:
Транзакцыі альбо выконваюцца цалкам, альбо не выконваюцца зусім.
Без частковага выканання: калі транзакцыя не ўдаецца на паўдарозе, любыя змены, унесеныя ў базу дадзеных, адкочваюцца.
Прыклад: разгледзьце магчымасць пераводу 100 долараў з рахунку X на рахунак Y. Калі транзакцыя не атрымоўваецца пасля выліку з X, але перад даданнем у Y, база дадзеных застаецца паслядоўнай.
–Паслядоўнасць:
База дадзеных павінна падтрымліваць абмежаванні цэласнасці да і пасля транзакцыі.
Прыклад: калі агульная сума да транзакцыі складае 700 долараў (X: 500 долараў, Y: 200 долараў), яна павінна заставацца ранейшай пасля транзакцыі (X: 400 долараў, Y: 300 долараў).
–Іlation:
Некалькі транзакцый могуць адбывацца адначасова, не закранаючы адна адну.
Змены, зробленыя адной транзакцыяй, не бачныя іншым, пакуль яны не будуць зафіксаваны.
Забяспечвае эквівалентныя вынікі, як калі б транзакцыі выконваліся паслядоўна.
Прыклад: ізаляцыя транзакцый прадухіляе неадпаведнасці з-за чаргавання аперацый.
–Даўгалецце:
Пасля здзяйснення транзакцыі яе змены застаюцца пастаяннымі.
Вытрымлівае сістэмныя збоі або збоі.
Забяспечвае захаванасць дадзеных.
Прыклад: нават пасля перазагрузкі сістэмы ўнесеныя змены застаюцца некранутымі.
Памятайце, што ўласцівасці ACID забяспечваюць аснову для надзейных і паслядоўных аперацый з базамі дадзеных! 🌟
Што такое шаблон стратэгіі?
Апісанне: вызначае сямейства алгарытмаў, інкапсулюе кожны з іх і робіць іх узаемазаменнымі. Гэта дазваляе алгарытму змяняцца незалежна ад кліентаў, якія іх выкарыстоўваюць.
прыклад:
Java
// Інтэрфейс для харчовых паводзін
інтэрфейс EatBehavior {
несапраўднае ёсць ();
}
// Канкрэтныя рэалізацыі харчовых паводзін
клас NormalDiet рэалізуе EatBehavior {
@Override
грамадскае несапраўднае ёсць() {
// Звычайнае харчаванне
}
}
клас LosingWeightDiet рэалізуе EatBehavior {
@Override
грамадскае несапраўднае ёсць() {
// Здаровае харчаванне
}
}
// Каціны клас з харчовымі паводзінамі
абстрактны клас Cat {
EatBehavior eatBehavior;
public void eat() { eatBehavior.eat();}public void setEatBehavior(EatBehavior eatBehavior) { this.eatBehavior = eatBehavior;}
}
// Выкарыстанне
Cat cat = new Cat();
cat.setEatBehavior(новы LosingWeightDiet());
cat.eat(); // Кот есць здаровай дыетай
Стваральныя ўзоры:
Гэтыя шаблоны сканцэнтраваны на стварэнні асобніка класа.
Прыклады ўключаны
— Фабрычны метад,
Пастаноўка праблемы: выкажам здагадку, што мы хочам стварыць розныя тыпы прадуктаў (напрыклад, аўтамабілі, ровары, веласіпеды) без жорсткай сувязі нашага кода з пэўнымі рэалізацыямі.
Ключавыя кампаненты:
Прадукт: абстрактны клас або інтэрфейс, які вызначае агульныя аперацыі для аб'ектаў, якія будуць створаны на заводзе.
Канкрэтныя прадукты: фактычныя класы, якія рэалізуюць інтэрфейс прадукту, які прадстаўляе пэўны тып аб'екта.
Creator: абстрактны клас або інтэрфейс, які дэкларуе фабрычны метад. Ён адказвае за стварэнне аб'ектаў Product, але дэлегуе фактычнае стварэнне падкласам.
Concrete Creators: падкласы Creator, якія рэалізуюць фабрычны метад. Яны вырашаюць, які канкрэтны бетонны прадукт стварыць на аснове ўваходных параметраў або канфігурацыі.
Factory Method: метад, вызначаны ў класе Creator, які стварае аб'екты Product. Звычайна гэта дэкларуецца як абстрактнае ў Creator і рэалізуецца ў Concrete Creators.
Прыклад у Java: дапусцім, у нас ёсць завод, які вырабляе розныя тыпы транспартных сродкаў. Вось спрошчаны прыклад:
Java
// АнатацыяПрадукт
інтэрфейс Прадукт {
несапраўдны дысплей();
}
// Жалезабетонныя вырабы
клас Аўтамабільныя прылады Прадукт {
публічны несапраўдны дысплей() {
System.out.println(“Car Created”);
}
}
клас Веласіпедныя прылады Прадукт {
публічны несапраўдны дысплей() {
System.out.println(“Веласіпед створаны”);
}
}
// Стваральнік (фабрыка)
інтэрфейс Factory {
Прадукт factoryMethod();
}
// Канкрэтныя творцы
клас ConcreteFactoryA рэалізуе Factory {
public Product factoryMethod() {
вярнуць новы аўтамабіль();
}
}
клас ConcreteFactoryB рэалізуе Factory {
public Product factoryMethod() {
вярнуць новы ровар();
}
}
публічны клас FactoryMethodExample {
public static void main(String[] args) {
Factory factoryA = новы ConcreteFactoryA();
Product productA = factoryA.factoryMethod();
productA.display();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.factoryMethod();
productB.display();
}
}
— Будаўнік
Шаблон канструктара – - гэта крэатыўны дызайнерскі шаблон, які дазваляе крок за крокам ствараць складаныя ’ekts.
аддзяленне іх канструкцыі ад іх прадстаўлення. Вось просты прыклад у Java:
// Вызначце клас, які вы хочаце стварыць
клас Паведамленне {
прыватны канчатковы загаловак радка;
прыватны канчатковы радковы тэкст;
прыватная канчатковая катэгорыя радка;
Post(Builder builder) { this.title = builder.title; this.text = builder.text; this.category = builder.category;}// Getters for propertiespublic String getTitle() { return title;}public String getText() { return text;}public String getCategory() { return category;}// Builder classpublic static class Builder { private String title; private String text; private String category; public Builder title(String title) { this.title = title; return this; } public Builder text(String text) { this.text = text; return this; } public Builder category(String category) { this.category = category; return this; } public Post build() { return new Post(this); }}
}
// Выкарыстанне
публічны клас Main {
public static void main(String[] args) {
Апублікаваць паведамленне = новы Post.Builder()
.title(“Java Builder Template”)
.text(“Тлумачэнне таго, як рэалізаваць канструктар шаблону ў Java”)
.category(“Шаблоны дызайну”)
.build();
System.out.println("Title: " + post.getTitle());
System.out.println("Text: " + post.getText());
System.out.println("Category: " + post.getCategory());
}
}
–Прататып
Шаблон прататыпа – - гэта крэатыўны шаблон дызайну, які дазваляе ствараць новыя ob’ects шляхам капіравання існуючага ob’ect.
Замест таго, каб ствараць новыя асобнікі з нуля, вы кланіруеце існуючы прататып, які можа быць больш эфектыўным і гнуткім. Давайце паглыбімся ў прыклад у Java:
Вызначэнне інтэрфейсу прататыпа: спачатку мы ствараем абстрактны клас або інтэрфейс пад назвай Tree з абстрактным метадам copy():
Java
публічны абстрактны клас Дрэва {
публічная абстрактная копія дрэва ();
}
Канкрэтныя прататыпы: далей мы рэалізуем два канкрэтныя класы, якія пашыраюць Tree: PlasticTree і PineTree. Гэтыя класы прадстаўляюць пэўныя тыпы дрэў і забяспечваюць уласную рэалізацыю метаду copy():
Java
публічны клас PlasticTree пашырае дрэва {
@Override
публічная копія дрэва () {
PlasticTree plasticTreeClone = новы PlasticTree(this.getMass(), this.getHeight());
plasticTreeClone.setPosition(this.getPosition());
вяртанне plasticTreeClone;
}
}
публічны клас PineTree пашырае дрэва {
@Override
публічная копія дрэва () {
PineTree pineTreeClone = новы PineTree(this.getMass(), this.getHeight());
pineTreeClone.setPosition(this.getPosition());
вяртанне pineTreeClone;
}
}
У гэтых класах мы наладжваем працэс кланавання на аснове канкрэтнага тыпу дрэва. Напрыклад, мы капіруем масу, вышыню і становішча зыходнага дрэва.
Выкарыстанне: цяпер давайце створым асобнікі нашых канкрэтных прататыпаў:
Java
публічны клас Main {
public static void main(String[] args) {
Дрэва originalPlasticTree = новае PlasticTree(10, 5);
Дрэва clonedPlasticTree = originalPlasticTree.copy();
Tree originalPineTree = new PineTree(15, 8);
Tree clonedPineTree = originalPineTree.copy();
// Use the cloned trees as needed
// ...
}
}
Што такое структурныя ўзоры?
Гэтыя шаблоны датычацца структуры і складу класа.
Шаблон –Aadapter
Шаблон адаптара – - гэта шаблон структурнага праектавання, які дазваляе прымусіць два несумяшчальныя інтэрфейсы працаваць разам.
Ён дзейнічае як мост паміж гэтымі інтэрфейсамі, дазваляючы супрацоўнічаць без змены іх зыходнага кода.
Адаптар Ab’ect:
У гэтым падыходзе мы выкарыстоўваем кампазіцыю, каб дэлегаваць логіку адаптару.
Адаптар змяшчае Adaptee і дэлегуе метад request() метаду specificRequest() у Adaptee.
Java
// Адаптаваны (існуючы клас)
клас Adaptee {
несапраўдны specificRequest() {
System.out.println(“Адаптаваны канкрэтны запыт”);
}
}
// Мэтавы інтэрфейс
інтэрфейс Target {
несапраўдны запыт();
}
// Адаптар (з выкарыстаннем кампазіцыі)
Клас Адаптар рэалізуе Target {
прыватны канчатковы Adaptee адаптаваны;
Adapter(Adaptee adaptee) { this.adaptee = adaptee;}@Overridepublic void request() { adaptee.specificRequest();}
}
Адаптар класа:
Патрабуецца множнае спадчыннасць (наўпрост немагчыма ў Java).
Мы можам дасягнуць гэтага з дапамогай інтэрфейсаў з метадамі па змаўчанні.
Адаптар пашырае класы Target і Adaptee.
Java
// Мэтавы інтэрфейс
інтэрфейс Target {
несапраўдны запыт();
}
// Адаптаваны (існуючы клас)
клас Adaptee {
несапраўдны specificRequest() {
System.out.println(“Адаптаваны канкрэтны запыт”);
}
}
// Адаптар (з выкарыстаннем спадчыны класаў)
клас Adapter пашырае Adaptee рэалізуе Target {
@Override
публічны несапраўдны запыт() {
указаныЗапыт();
}
}
Перавагі і кампрамісы:
Адаптар класа добра працуе для адлюстравання метадаў адзін да аднаго.
Адаптар Ab’ect забяспечвае большую гнуткасць і дазваляе пазбегнуць мадыфікацыі кода.
– Шаблон дэкаратара
Шаблон дэкаратара – - гэта крэатыўны шаблон дызайну, які дазваляе дынамічна дадаваць функцыянальнасць і паводзіны ў праект ’ без яго.
якія ўплываюць на паводзіны іншых існуючых аб'ектаў у тым жа класе. Гэта асабліва карысна, калі вы хочаце пашырыць ’ect
магчымасці без змены яго структуры.
агляд:
Дэкаратар шаблону забяспечвае палепшаны інтэрфейс зыходнага аб'екта, надзяляючы яго дадатковай функцыянальнасцю.
Мы аддаем перавагу кампазіцыі перад спадчынай, каб паменшыць выдаткі на падкласы.
Дэкаратары могуць быць дададзены падчас выканання, што забяспечвае гнуткасць.
Прыклад сцэнарыя: выкажам здагадку, што ў нас ёсць калядная ёлка, і мы хочам упрыгожыць яе рознымі прадметамі, такімі як гірлянды, мішура і лямпачкі. Мы будзем прытрымлівацца арыгінальных правілаў дызайну Gang of Four:
Рэалізацыя:
Спачатку стварыце інтэрфейс ChristmasTree:
Java
публічны інтэрфейс ChristmasTree {
Радок упрыгожыць();
}
Рэалізуйце інтэрфейс з базавым дрэвам:
Java
публічны клас ChristmasTreeImpl рэалізуе ChristmasTree {
@Override
грамадскі радок упрыгожыць() {
вярнуць «Ёлку»;
}
}
Затым стварыце абстрактны клас TreeDecorator, які рэалізуе ChristmasTree і змяшчае ўпрыгожанае дрэва:
Java
публічны абстрактны клас TreeDecorator рэалізуе ChristmasTree {
прыватнае апошняе ChristmasTree дрэва;
public TreeDecorator(ChristmasTree tree) { this.tree = tree;}@Overridepublic String decorate() { return tree.decorate();}
}
Цяпер стварыце пэўныя дэкаратары. Напрыклад, BubbleLights:
Java
публічны клас BubbleLights пашырае TreeDecorator {
public BubbleLights(ChristmasTree tree) {
супер(дрэва);
}
@Overridepublic String decorate() { return super.decorate() + " with Bubble Lights";}
}
публічны клас Garland пашырае TreeDecorator {
public Garland(ChristmasTree tree) {
супер(дрэва);
}
@Overridepublic String decorate() { return super.decorate() + " with Garland";}
}
выкарыстанне:
Стварыце ўпрыгожаныя дрэвы:
Java
публічны клас DecoratorPatternDemo {
public static void main(String[] args) {
ChristmasTree tree1 = новая гірлянда(новая ChristmasTreeImpl());
System.out.println(tree1.decorate()); // Выхад: “Ёлка з гарляндай”
ChristmasTree tree2 = new BubbleLights(new Garland(new Garland(new ChristmasTreeImpl())));
System.out.println(tree2.decorate()); // Output: "Christmas tree with Garland with Garland with Bubble Lights"
}
}
Шаблон дазваляе дадаваць дэкаратары падчас выканання, даючы магчымасць упрыгожваць па меры неабходнасці.
Памятайце, дэкаратар шаблону шырока выкарыстоўваецца ў сцэнарыях, калі вы хочаце палепшыць паводзіны аб'екта, не змяняючы яго базавую структуру.
— Чарцёж фасада
Шаблон фасада – - гэта шаблон структурнага дызайну, які спрашчае ўзаемадзеянне са складанай падсістэмай, забяспечваючы адзіны інтэрфейс.
Ён дзейнічае як ўваходныя дзверы “”, каб схаваць асноўную складанасць і палегчыць кліентам выкарыстанне сістэмы
–Campasite
Шаблон кемпінга – - гэта структурны шаблон дызайну, які дазваляе збіраць аб'екты ’ у дрэвападобную структуру для прадстаўлення іерархіі частковых цэлых.
Асноўная ідэя кампазітнага шаблону – заключаецца ў стварэнні дрэвападобнай структуры ab’ects, дзе асобныя ab’ects і кампазітныя ab’ects маюць агульны інтэрфейс.
Базавы кампанент (аддзел): мы вызначым просты інтэрфейс аддзела ў якасці базавага кампанента:
Java
аддзел публічнага інтэрфейсу {
несапраўдны printDepartmentName();
}
Ліставыя кампаненты (FinancialDepartment і SalesDepartment): Давайце створым класы для фінансавага аддзела і аддзела продажаў, абодва з якіх рэалізуюць інтэрфейс Department:
Java
публічны клас FinancialDepartment рэалізуе Department {
// Дэталі рэалізацыі (напрыклад, id, імя)
public void printDepartmentName() {
System.out.println(getClass().getSimpleName());
}
}
публічны клас SalesDepartment рэалізуе аддзел {
// Дэталі рэалізацыі (напрыклад, id, імя)
public void printDepartmentName() {
System.out.println(getClass().getSimpleName());
}
}
Гэтыя ліставыя класы рэалізуюць метад printDepartmentName() і не ўтрымліваюць спасылак на іншыя аб'екты Department.
Кампазітны элемент (HeadDepartment): у якасці кампазітнага класа давайце створым HeadDepartment, які змяшчае калекцыю кампанентаў аддзела:
Java
імпартаваць java.util.ArrayList;
імпартаваць java.util.List;
публічны клас HeadDepartment рэалізуе аддзел {
прыватны цэлы лік;
прыватнае імя радка;
прыватны спіс childDepartments;
public HeadDepartment(Integer id, String name) { this.id = id; this.name = name; this.childDepartments = new ArrayList<>();}public void printDepartmentName() { childDepartments.forEach(Department::printDepartmentName);}public void addDepartment(Department department) { childDepartments.add(department);}public void removeDepartment(Department department) { childDepartments.remove(department);}
}
Клас HeadDepartment рэалізуе метад printDepartmentName() і забяспечвае метады для дадання і выдалення даччыных аддзелаў.
Выкарыстанне: Вы можаце ствараць асобнікі аддзелаў канчатковых аддзелаў (напрыклад, FinancialDepartment, SalesDepartment) і складовых аддзелаў (напрыклад, HeadDepartment). Дадайце ў кампазіцыю аддзелы ліста і вывядзіце іх назвы.
Java
публічны клас Main {
public static void main(String[] args) {
Фінансавы аддзел = новы Фінансавы аддзел ();
Аддзел продажаў = новы SalesDepartment();
HeadDepartment headDepartment = new HeadDepartment(1, "Company Departments");
headDepartment.addDepartment(finance);
headDepartment.addDepartment(sales);
headDepartment.printDepartmentName();
}
}
выхад:
Фінансавы аддзел
Аддзел продажаў
Кампазітны шаблон дазваляе ствараць гнуткія дрэвавыя структуры, дзе
асобныя прадметы і кампазіцыі (кампазіты) могуць трактавацца аднастайна.
Што такое ХЭШ-функцыя !!!
Хэш-функцыя – - гэта матэматычная функцыя, якая прымае ўвод (або “ або ”) і вяртае радок сімвалаў фіксаванага памеру,
які звычайна ўяўляе сабой паслядоўнасць лічбаў і літар. Гэты вынік называецца “hash-значэнне ” або проста “hash ”.
Хэш-функцыі звычайна выкарыстоўваюцца ў інфарматыцы і крыптаграфіі, і яны маюць некалькі важных уласцівасцей:
=== Як бы вы выкарыстоўвалі хэш-функцыю і як яна працуе?
Дэтэрмінаваны: аднолькавы ўвод заўсёды будзе ствараць аднолькавы хэш.
Хуткі: функцыя можа хутка вылічыць хэш-значэнне для любога ўводу.
Унікальны (амаль): два розныя ўводы павінны ствараць розныя хэшы (гэта вядома як мінімізацыя сутыкненняў “ ”).
Незваротны: улічваючы хэш, вызначыць зыходны ўвод павінна быць немагчыма з пункту гледжання вылічэнняў.
Раўнамернае: хэш-значэнні раўнамерна размеркаваны па прасторы вываду.
Хэш-функцыі шырока выкарыстоўваюцца ў розных прыкладаннях, такіх як:
Цэласнасць даных: каб гарантаваць, што даныя не былі зменены або падробленыя, шляхам параўнання хэш-значэнняў.
Захоўванне пароляў: бяспечнае захоўванне хэшаваных пароляў замест фактычных пароляў.
Крыптаграфія: выкарыстоўваецца ў лічбавых подпісах і іншых крыптаграфічных алгарытмах.
Хэш-табліцы: для эфектыўнага пошуку даных пры праграмаванні.
=== Дайце мне прыклад хэш-карты, як бы вы яе выкарысталі?
SHA (Бяспечны алгарытм хэшавання):
Уключае такія варыянты, як SHA-1, SHA-256, SHA-384 і SHA-512.
SHA-256 і SHA-512 шырока выкарыстоўваюцца ў крыптаграфіі і тэхналогіі блокчейн (напрыклад, Bitcoin).
імпартаваць java.security.MessageDigest;
імпарт java.security.NoSuchAlgorithmException;
публічны клас HashExample {
public static void main(String[] args) {
паспрабаваць {
// Уваходны радок для хэшавання
Увод радка = “Hello World!”;
// Create a MessageDigest instance for SHA-256
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// Compute the hash
byte[] hash = digest.digest(input.getBytes());
// Convert the hash bytes to a hexadecimal string
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = String.format("%02x", b);
hexString.append(hex);
}
// Print the resulting hash
System.out.println("SHA-256 Hash: " + hexString.toString());
} catch (NoSuchAlgorithmException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Уваходныя даныя: Уваходная зменная змяшчае даныя, якія вы хочаце хэшаваць.
Ініцыялізацыя MessageDigest: асобнік MessageDigest ствараецца з дапамогай getInstance(“SHA-256”), які вызначае алгарытм хэшавання SHA-256.
Хэшаванне: метад дайджэста вылічвае хэш ўваходных даных.
Шаснаццатковае пераўтварэнне: паколькі хэш знаходзіцца ў двайковым фармаце, мы выкарыстоўваем цыкл, каб пераўтварыць яго ў больш чытэльны шаснаццатковы радок.
Ставіць і латаць? Калі яго выкарыстоўваць?
І PUT, і PATCH – - гэта метады HTTP, якія выкарыстоўваюцца для абнаўлення рэсурсаў сервера, але яны адрозніваюцца спосабам апрацоўкі абнаўленняў:
СТАВІЦЬ:
Поўнае абнаўленне:
PUT выкарыстоўваецца для поўнай замены існуючага рэсурсу.
У запыце трэба адпраўляць увесь рэсурс, нават калі змяняецца толькі яго частка.
Калі рэсурс не існуе, PUT часта стварае яго (хаця такія паводзіны могуць адрознівацца).
Ідэмпотэнт:
Паўторныя запыты PUT з аднолькавымі дадзенымі заўсёды будуць прыводзіць да таго ж стану рэсурсу.
Прыклад: Абнаўленне профілю карыстальніка:
json
PUT /users/123
{
“name”: “Веліслаў”,
“электронная пошта”: OZYX2Zvelislav@example.comOZYX3Z,
«узрост»: 30
}
Калі змяняецца толькі імя, але адрас электроннай пошты і ўзрост застаюцца ранейшымі, яны ўсё роўна павінны быць уключаны ў запыт.
ПАТЧЫ:
Частковае абнаўленне:
PATCH выкарыстоўваецца для частковага абнаўлення існуючага рэсурсу.
У запыце неабходна адправіць толькі тыя палі, якія змяняюцца.
Ідэмпотэнт (у асноўным):
Як і PUT, паўторныя запыты PATCH з аднолькавымі дадзенымі звычайна прыводзяць да таго ж стану рэсурсу.
Аднак паводзіны могуць залежаць ад рэалізацыі сервера.
Прыклад: абнаўленне толькі імя карыстальніка:
json
ПАТЧ /users/123
{
“name”: “Велислав”
}
Тут абнаўляецца толькі поле імя, астатнія палі пакідаюцца без зменаў.
Ключавая розніца:
PUT замяняе ўвесь рэсурс, у той час як PATCH змяняе толькі вызначаныя палі рэсурсу.
Метады HTTP з кароткім апісаннем.
GET: Выкарыстоўваецца для атрымання дадзеных з сервера без іх змянення. Звычайна выкарыстоўваецца для атрымання рэсурсаў або інфармацыі.
POST: Выкарыстоўваецца для адпраўкі дадзеных на сервер, звычайна для стварэння новага рэсурсу. Напрыклад, адпраўка формы або загрузка файла.
PUT: Выкарыстоўваецца для абнаўлення або поўнай замены існуючага рэсурсу на серверы. Калі рэсурс не існуе, яго можна стварыць.
ПАТЧ: Выкарыстоўваецца для частковага абнаўлення існуючага рэсурсу, змяняючы толькі ўказаныя палі.
ВЫДАЛІЦЬ: Выкарыстоўваецца для выдалення рэсурсу з сервера.
HEAD: Падобна GET, выкарыстоўваецца для атрымання загалоўкаў без цела рэсурсу.
ПАРАМЕТРЫ: паказвае, якія метады HTTP дазволены.
TRACE: выкарыстоўваецца галоўным чынам для дыягнастычных мэт шляхам вяртання запыту кліенту
CONNECT: усталёўвае тунэль да сервера, які часта выкарыстоўваецца для злучэнняў SSL/TLS.
========== Функцыянальны інтэрфейс ======================================
Функцыянальны інтэрфейс у Java – - гэта інтэрфейс, які змяшчае роўна адзін абстрактны метад. Гэтыя інтэрфейсы выкарыстоўваюцца ў асноўным у лямбда-выразах і спасылках на метады, што забяспечвае больш лаканічнае і зразумелае функцыянальнае праграмаванне.
Асноўныя характарыстыкі:
- Адзіны абстрактны метад: Функцыянальны інтэрфейс мае толькі адзін абстрактны метад. У гэтым сутнасць яго функцыянальнасці.
- Па змаўчанні і статычныя метады: Функцыянальныя інтэрфейсы могуць уключаць метады па змаўчанні і статычныя метады, але яны не залічваюцца як адзіны абстрактны метад.
- Анатацыя @FunctionalInterface: Нягледзячы на тое, што гэтая анатацыя неабавязковая, яна дапамагае, сігналізуючы, што інтэрфейс павінен быць функцыянальным. Калі ў інтэрфейс дадаюцца дадатковыя абстрактныя метады, кампілятар выдае памылку.
прыклад:
@FunctionalInterfaceinterface Calculator { int calculate(int a, int b);}// Using lambda expressionpublic class Main { public static void main(String[] args) { // Implementing the calculate method using a lambda Calculator addition = (a, b) -> a + b; Calculator multiplication = (a, b) -> a * b; System.out.println("Addition: " + addition.calculate(5, 3)); // Output: 8 System.out.println("Multiplication: " + multiplication.calculate(5, 3)); // Output: 15 }}
Выпадак выкарыстання:
The Calculator інтэрфейс у прыкладзе мае адзіны абстрактны метад calculate, што робіць яго функцыянальным інтэрфейсам.
Гэта дазваляе нам выкарыстоўваць лямбда-выразы для сцісласці і элегантнасці ў рэалізацыі.
Агульныя функцыянальныя інтэрфейсы ў Java:
Java забяспечвае некалькі ўбудаваных функцыянальных інтэрфейсаў у java.util.function пакеты, такія як:
- Выказнік: прымае ўвод і вяртае лагічнае значэнне.
- Функцыя: прымае ўвод і вяртае вывад тыпу R.
- Пастаўшчык: Дае значэнне без уводу.
- спажывец: прымае значэнне і выконвае дзеянне.
Функцыянальныя інтэрфейсы аптымізуюць аперацыі, асабліва ў такіх сцэнарах, як праца з калекцыямі, патокамі або асінхроннымі задачамі.
Яны дазваляюць Java прыняць функцыянальныя парадыгмы праграмавання, захоўваючы пры гэтым сваю абстрактна-арыентаваную прыроду.
================ функцыя вышэйшага парадку ===============================
Функцыя больш высокага парадку – - гэта функцыя, якая альбо прымае іншыя функцыі ў якасці аргументаў, альбо вяртае функцыю ў выніку. Іншымі словамі, яна кіруе функцыямі, робячы іх моцнымі для «першакласных грамадзян». Гэта магутная функцыя ў парадыгмах функцыянальнага праграмавання, якая дазваляе абстрагавацца, паўторна выкарыстоўваць код і кампазіцыю.
Прыклад функцыі вышэйшага парадку ў Java:
import java.util.function.Function;public class Main { public static void main(String[] args) { // Higher-order function: applies a function to a value Function<Integer, Integer> squareFunction = x -> x * x; int result = applyFunction(5, squareFunction); System.out.println("Square of 5: " + result); // Output: 25 } public static int applyFunction(int value, Function<Integer, Integer> function) { return function.apply(value); }}
У прыкладзе вышэй:
- The
applyFunctionметад z’ з'яўляецца функцыяй больш высокага парадку, таму што ён прымае іншую функцыю (Function<Integer, Integer>) як параметр.
Асаблівасці:
- Прымае функцыі ў якасці аргументаў: Функцыі вышэйшага парадку могуць прымаць іншыя функцыі ў якасці ўваходных дадзеных для выканання пэўных аперацый.
- Вяртае функцыі: Яны могуць ствараць і вяртаць новыя функцыі дынамічна.
- Заахвочвае паўторнае выкарыстанне кода: прасоўвае модульны і шматразовы код, паколькі функцыі можна перадаваць і складаць разам.
Выпадак выкарыстання:
У Java функцыі больш высокага парадку звычайна выкарыстоўваюцца ў функцыянальным праграмаванні з патокамі, лямбда-выразамі і спасылкамі на метады. Напрыклад:
List<String> names = Arrays.asList("John", "Jane", "Jake");names.stream() .filter(name -> name.startsWith("J")) // Takes a lambda function as argument .forEach(System.out::println); // Takes a method reference as argument
Функцыі вышэйшага парадку забяспечваюць гібкасць і магутнасць праграм Java, дазваляючы распрацоўшчыкам пісаць чысты, лаканічны і выразны код!
Некаторыя наборы адказаў на Interv’yu ў рэальным свеце тут.
- Разумее такія асновы, як палімарфізм, статычныя метады і пул радкоў
- знаёмыя з калекцыямі (напрыклад, HashSet, TreeSet) і варыянтамі іх выкарыстання.
- Правільна ідэнтыфікуе вобласці Bean (адзіночны элемент, прататып)
- Даведайцеся пра залежнасць і яе мэты.
- ведае, як рэалізаваць адносіны шмат-да-многім з дапамогай табліц спалучэнняў.
- Разумее прызначэнне індэксаў (хоць павярхоўна)
- можа адрозніваць маналітную і мікрасэрвісную архітэктуры
- разумее асноўныя кампрамісы (маштабаванасць, абслугоўванне)
- няправільна разумее прынцып падстаноўкі Ліскова і інверсію залежнасці
- Змагаецца, каб даць канкрэтныя прыклады адкрытага/закрытага прынцыпу.
- Не хапае глыбіні ў кіраванні жыццёвым цыклам фасолі
- Збянтэжаны пашыранай залежнасцю in’ection
- павярхоўнае разуменне індэксаў (кампазітныя індэксы, аптымізацыя запытаў)
- Не знаёмы з узроўнямі ізаляцыі і аптымістычным/песімістычным блакаваннем
Плюсы:
- Працаваў са старым кодам у вялізнай і складанай сістэме
- Ведае СОЛІД
- Веданне патокаў
- Тлумачэнне індэксаў і ACID
- Добры ўзровень англійскай мовы
Мінусы: - Няма адказнасці за разгортванне або інфраструктуру, удзел у архітэктурным праектаванні
- Мае пэўныя веды аб прынцыпах ААП, але вельмі цяжка растлумачыць іх і памыліўся ў некаторых канцэпцыях
- Агульныя веды аб калекцыях, але ёсць прабелы і вельмі няпэўныя
- Не разумее розніцы паміж паралелізмам і паралелізмам, не вельмі добра ведае паралелізм
- Не вельмі вывучаў архітэктуру мікрасэрвісаў
- Расплывістыя некаторыя паняцці базы дадзеных (абмеркаванне індэксаў было на павярхоўным узроўні)
- Не магу растлумачыць livelock
- Прабелы ў канчатковым выніку блакуюць разуменне
- Абмежаваныя веды аб асаблівасцях апрацоўкі выключэнняў
- Блытаніна вакол мадыфікатараў доступу (абаронены супраць прыватнага пакета)
Адна музыка … .. јъје
не падыходзіць для пасады распрацоўшчыка Mid-Java з-за прабелаў у яго тэхнічных ведах.
Плюсы
Добра растлумачыў SOLID
Добра растлумачыў ААП
Тлумачэнне кампазіцыі (але спачатку крыху цяжка)
Выдатнае разуменне калекцый
Розніца паміж спісамі і наборамі
Хэшсеты
Hashmap
ConcurrentHashmap
Добрае разуменне структур даных – стэкі, чэргі, дрэвы
Добрае веданне архітэктуры jvm
Растлумачыў паралелізм супраць паралелізму, прадэманстраваў добрае веданне шматструменных прыкладанняў
Добрае разуменне REST
Добра растлумачыў індэксы db
Тлумачэнне розных тыпаў злучэнняў

Пакінуць адказ