JavaRush /Java Blog /Random-TK /Sapaklary we interfeýsleri dizaýn etmek (Makalanyň terjim...
fatesha
Dereje

Sapaklary we interfeýsleri dizaýn etmek (Makalanyň terjimesi)

Toparda çap edildi
Synplary we interfeýsleri dizaýn etmek (Makalanyň terjimesi) - 1

Mazmuny

  1. Giriş
  2. Interfeýsler
  3. Interfeýs bellikleri
  4. Funksiýa interfeýsleri, statiki usullar we deslapky usullar
  5. Abstrakt sapaklar
  6. Üýtgemeýän (hemişelik) sapaklar
  7. Anonim synplar
  8. Görünmek
  9. Miras
  10. Birnäçe miras
  11. Miras we kompozisiýa
  12. Enkapsulýasiýa
  13. Jemleýji synplar we usullar
  14. Indiki näme
  15. Çeşme koduny göçürip al

1. TANYŞDYRYŞ

Haýsy programmirleme dilini ulansaňyzam (we Java hem muňa gabat gelmeýär), oňat dizaýn ýörelgelerine eýermek arassa, düşnükli we barlap boljak kod ýazmagyň açarydyr; uzak ömür sürmek we meseläni çözmegi aňsat goldamak üçin dörediň. Gollanmanyň bu bölüminde, Java diliniň berýän esasy gurluş bloklaryny ara alyp maslahatlaşarys we has gowy dizaýn kararlaryny almaga kömek etmek maksady bilen birnäçe dizaýn ýörelgelerini hödürläris. Has takygy, interfeýsleri we interfeýsleri deslapky usullary (Java 8-de täze bir aýratynlyk), abstrakt we jemleýji synplary, üýtgewsiz synplary, mirasy, kompozisiýany ara alyp maslahatlaşarys we gysgaça degip geçen görüniş (ýa-da elýeterlilik) düzgünlerine täzeden serederis. 1-nji bölüm "Obýektleri nädip döretmeli we ýok etmeli" .

2. GÖRNÜŞLER

Obýekte gönükdirilen programmirlemekde interfeýs düşünjesi şertnamalary ösdürmek üçin esas döredýär . Gysgaça aýdylanda, interfeýsler usullaryň (şertnamalaryň) toplumyny kesgitleýär we şol anyk interfeýs üçin goldaw talap edýän her synp şol usullaryň durmuşa geçirilmegini üpjün etmeli: gaty ýönekeý, ýöne güýçli pikir. Programmirleme dilleriniň köpüsinde bir görnüşde interfeýs bar, ýöne esasanam Java munuň üçin dil goldawyny berýär. Java-da ýönekeý interfeýs kesgitlemesine göz aýlalyň.
package com.javacodegeeks.advanced.design;

public interface SimpleInterface {
void performAction();
}
Aboveokardaky bölekde, biziň çagyran interfeýsimiz SimpleInterface, diňe bir diýilýän usuly yglan edýär performAction. Interfeýsler bilen synplaryň arasyndaky esasy tapawut, interfeýsler kontaktyň nämedigini görkezýär (usuly yglan edýärler), ýöne durmuşa geçirilmegini üpjün etmeýär. Şeýle-de bolsa, Java-daky interfeýsler has çylşyrymly bolup biler: içerki interfeýsleri, synplary, sanlary, düşündirişleri we yzygiderliligi öz içine alyp biler. Mysal üçin:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefinitions {
    String CONSTANT = "CONSTANT";

    enum InnerEnum {
        E1, E2;
    }

    class InnerClass {
    }

    interface InnerInterface {
        void performInnerAction();
    }

    void performAction();
}
Bu has çylşyrymly mysalda, höwürtge gurluşlaryna we usul beýannamalaryna şertsiz interfeýs girizýän birnäçe çäklendirmeler bar we bular Java düzüjisi tarapyndan ýerine ýetirilýär. Ilki bilen, aç-açan yglan edilmese-de, interfeýsdäki her bir usul deklarasiýasy köpçülige açykdyr (we diňe köpçülige açyk bolup biler). Şeýlelik bilen aşakdaky usul beýannamalary deňdir:
public void performAction();
void performAction();
Interfeýsdäki her usulyň aç - açan yglan edilendigini , hatda bu usul beýannamalarynyň hem deňdigini bellemelidiris :
public abstract void performAction();
public void performAction();
void performAction();
Jaý yglan edilen hemişelik meýdanlar barada aýdylanda bolsa, köpçülige açyk bolmakdan başga-da , olar hem statik we gutarnykly . Şonuň üçin aşakdaky beýannamalar hem deňdir:
String CONSTANT = "CONSTANT";
public static final String CONSTANT = "CONSTANT";
Netijede, köpçülige açyk bolmakdan başga-da, ýerleşdirilen synplar, interfeýsler ýa-da sanlar hem statik diýlip yglan edilýär . Mysal üçin, bu beýannamalar hem şoňa deňdir:
class InnerClass {
}

static class InnerClass {
}
Saýlaýan stiliňiz şahsy isleg, ýöne interfeýsleriň bu ýönekeý häsiýetlerini bilmek sizi gereksiz ýazmakdan halas edip biler.

3. Interfeýs markeri

Marker interfeýsi, usullary ýa-da başga höwürtgeleri bolmadyk aýratyn interfeýsdir. Java kitaphanasy ony nädip kesgitleýär:
public interface Cloneable {
}
Interfeýs markerleri şertnama däl, ýöne belli bir aýratynlygy synp bilen "birikdirmek" ýa-da "baglanyşdyrmak" üçin birneme peýdaly usuldyr. Mysal üçin, “Cloneable” barada aýdylanda , synp klonlaşdyrylyp bilner, ýöne muny amala aşyrmagyň ýa-da durmuşa geçirmegiň usuly interfeýsiň bir bölegi däl. Interfeýs markeriniň iň meşhur we giňden ulanylýan mysaly Serializable:
public interface Serializable {
}
Bu interfeýs synpy seriallaşdyrmak we deserializasiýa üçin amatly diýip belleýär we ýene-de munuň nädip amala aşyrylyp bilinjekdigini ýa-da edilmelidigini görkezmeýär. Interfeýs markerleri, şertnama bolmak üçin interfeýsiň esasy maksadyny kanagatlandyrmasa-da, obýekte gönükdirilen programmirlemekde öz ornuny eýeleýär. 

4. Funksiýa interfeýsleri, DEFAULT USULLAR WE STATIK USULLAR

“Java 8” çykandan bäri interfeýsler gaty gyzykly täze aýratynlyklara eýe boldy: statiki usullar, deslapky usullar we lambdalardan (funksional interfeýsler) awtomatiki öwrülişik. Interfeýsler bölüminde Java-daky interfeýsleriň diňe usullary yglan edip biljekdigini, ýöne olaryň durmuşa geçirilmegini üpjün etmeýändigini belledik. Adaty usul bilen zatlar başga: interfeýs usuly esasy açar söz bilen belläp biler we munuň üçin ýerine ýetiriş üpjün edip biler. Mysal üçin:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefaultMethods {
    void performAction();

    default void performDefaulAction() {
        // Implementation here
    }
}
Mysal derejesinde bolmak bilen, her interfeýsiň ýerine ýetirilmegi bilen deslapky usullar ýok edilip bilner, ýöne interfeýsler indi statiki usullary hem öz içine alyp biler, mysal üçin: paket com.javacodegeeks.advanced.design;
public interface InterfaceWithDefaultMethods {
    static void createAction() {
        // Implementation here
    }
}
Interfeýsde ýerine ýetirilişi üpjün etmek şertnamalaýyn programmirlemegiň ähli maksadyny ýeňýär diýip bileris. Theseöne bu aýratynlyklaryň Java diline girizilmeginiň köp sebäpleri bar we näçe peýdaly ýa-da bulaşyk bolsa-da, olar siziň we ulanyşyňyz üçin bar. Funksiýa interfeýsleri başga bir hekaýa we dile gaty peýdaly goşundylardygyny subut etdi. Esasan, işleýän interfeýs, diňe yglan edilen abstrakt usul bilen interfeýsdir. RunnableAdaty kitaphananyň interfeýsi bu düşünjäniň gaty gowy mysalydyr.
@FunctionalInterface
public interface Runnable {
    void run();
}
Java düzüjisi funksional interfeýslere başgaça seredýär we lambda funksiýasyny manyly ýerine ýetirilýän interfeýs ýerine ýetirip biler. Aşakdaky funksiýanyň beýanyna seredeliň: 
public void runMe( final Runnable r ) {
    r.run();
}
Bu funksiýany Java 7 we ondan aşakda çagyrmak üçin interfeýsiň ýerine ýetirilmegi üpjün edilmelidir Runnable(mysal üçin, anonim synplary ulanmak), ýöne Java 8-de lambda sintaksisini ulanyp run () usulynyň ýerine ýetirilmegini üpjün etmek ýeterlikdir:
runMe( () -> System.out.println( "Run!" ) );
Mundan başga-da, @FunctionalInterface düşündiriş (düşündirişler gollanmanyň 5-nji bölüminde jikme-jik görkeziler) düzüjiniň interfeýsde diňe bir abstrakt usulyň bardygyny ýa-da ýokdugyny barlap biljekdigini görkezýär, şonuň üçin geljekde interfeýsde edilen üýtgeşmeler bu çaklamany bozmaz. .

5. GYSGAÇA KLASLAR

Java dili tarapyndan goldanýan başga bir gyzykly düşünje abstrakt synplar düşünjesidir. Abstrakt synplar Java 7-de interfeýslere birneme meňzeýär we Java 8-de deslapky usul interfeýsine gaty ýakyn. Adaty sapaklardan tapawutlylykda abstrakt synpy derrew açyp bolmaýar, ýöne ony bölüp bolýar (has giňişleýin maglumat üçin Miras bölümine serediň). Has möhümi, abstrakt synplarda abstrakt usullar bolup biler: edil interfeýs ýaly durmuşa geçirilmezden aýratyn usul. Mysal üçin:
package com.javacodegeeks.advanced.design;

public abstract class SimpleAbstractClass {
    public void performAction() {
        // Implementation here
    }

    public abstract void performAnotherAction();
}
Bu mysalda synp abstraktSimpleAbstractClass diýlip yglan edilýär we bir yglan edilen abstrakt usuly öz içine alýar. Abstrakt sapaklar örän peýdaly; durmuşa geçiriş jikme-jiklikleriniň köpüsini ýa-da käbir böleklerini köp kiçi toparlaryň arasynda paýlaşyp bolýar. Mümkin boldugyça, olar gapydan ajar goýýarlar we abstrakt usullary ulanyp, her kiçi klasa mahsus häsiýeti sazlamaga mümkinçilik berýärler. Diňe köpçülige bildirişleri öz içine alyp bilýän interfeýslerden tapawutlylykda abstrakt synplaryň abstrakt usulyň görünmegine gözegçilik etmek üçin elýeterlilik düzgünleriniň doly güýjüni ulanyp biljekdigini bellemelidiris .

6. GYSGAÇA KLASLAR

Üýtgemezlik häzirki döwürde programma üpjünçiligini ösdürmekde has möhüm bolýar. Köp ýadroly ulgamlaryň ösmegi maglumatlary paýlaşmak we parallellik bilen baglanyşykly köp meseläni gozgady. Oneöne bir mesele hökman ýüze çykdy: üýtgäp bilýän ýagdaýyň az bolmagy (ýa-da ýok) has giňelmegine (ulalmagyna) we ulgam hakda has aňsat pikirlenmegine getirýär. Gynansagam, Java dili synpyň üýtgemezligi üçin mynasyp goldaw bermeýär. Şeýle-de bolsa, usullaryň utgaşmasyny ulanyp, üýtgewsiz sapaklary düzmek mümkin bolýar. Ilki bilen synpyň ähli meýdanlary gutarnykly bolmaly ( gutarnykly diýilýär ). Bu gowy başlangyç, ýöne kepillik ýok. 
package com.javacodegeeks.advanced.design;

import java.util.Collection;

public class ImmutableClass {
    private final long id;
    private final String[] arrayOfStrings;
    private final Collection<String> collectionOfString;
}
Ikinjiden, dogry başlamagy üpjün ediň: bir meýdan kolleksiýa ýa-da massiw bolsa, bu meýdanlary gönüden-göni konstruktor argumentlerinden bellemäň, ýerine göçüriň. Bu kolleksiýanyň ýa-da massiwiň ýagdaýynyň daşynda üýtgedilmezligini üpjün eder.
public ImmutableClass( final long id, final String[] arrayOfStrings,
        final Collection<String> collectionOfString) {
    this.id = id;
    this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
    this.collectionOfString = new ArrayList<>( collectionOfString );
}
Iň soňunda bolsa, dogry elýeterliligi üpjün etmek. Kolleksiýalar üçin üýtgewsizlik örtük hökmünde üpjün edilmelidir  Collections.unmodifiableXxx: massiwler bilen hakyky üýtgewsizligi üpjün etmegiň ýeke-täk usuly, massiwine salgylanmany yzyna gaýtarmagyň ýerine göçürme bermekdir. Amaly nukdaýnazardan kabul edilip bilinmez, sebäbi massiwiň ululygyna gaty bagly we zibil ýygnaýjysyna uly basyş edip biler.
public String[] getArrayOfStrings() {
    return Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
}
Hatda bu kiçijik mysal, üýtgewsizligiň Java-da birinji synp raýaty däldigi barada gowy düşünje berýär. Üýtgemeýän synpyň başga bir synpyň obýektine degişli meýdany bar bolsa, zatlar çylşyrymlaşyp biler. Şol synplar hem üýtgewsiz bolmaly, ýöne muny üpjün etmegiň usuly ýok. Koduňyzy barlamak we umumy Java programmirleme kemçiliklerini görkezmek bilen FindBugs we PMD ýaly birnäçe oňat Java çeşme analizçileri bar. Bu gurallar islendik Java döredijiniň ajaýyp dostlarydyr.

7. ANONYM KLASLAR

Java-dan öňki 8-nji döwürde, näbelli synplar sapaklarda kesgitlenmegini we derrew dessine berilmegini üpjün etmegiň ýeke-täk usulydy. Anonim synplaryň maksady, gazany azaltmak we synplary ýazgy hökmünde görkezmegiň gysga we aňsat usulydy. Java-da täze sapak açmagyň adaty köne usullaryna göz aýlalyň:
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread(
            // Example of creating anonymous class which implements
            // Runnable interface
            new Runnable() {
                @Override
                public void run() {
                    // Implementation here
                }
            }
        ).start();
    }
}
Bu mysalda, interfeýsiň ýerine ýetirilmegi Runnablederrew näbelli synp hökmünde berilýär. Anonim synplar bilen baglanyşykly käbir çäklendirmeler bar bolsa-da, olary ulanmagyň esasy kemçilikleri, dil hökmünde Java-yň hökmany bolan ýokary sözli gurluş sintaksisidir. Hatda hiç zat etmeýän näbelli synp hem her gezek ýazylanda azyndan 5 setir kod talap edýär.
new Runnable() {
   @Override
   public void run() {
   }
}
Bagtymyza, Java 8, lambda we funksional interfeýsler bilen bu stereotipleriň hemmesi ýakyn wagtda ýok bolar, ahyrsoňy Java koduny ýazmak hakykatdanam gysga görüner.
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread( () -> { /* Implementation here */ } ).start();
    }
}

8. GÖRNÜŞ

Gollanmanyň 1-nji bölüminde Java-da görünmek we elýeterlilik düzgünleri barada azajyk gürleşdik. Bu bölümde, bu mowzugy täzeden gözden geçireris, ýöne kiçi klassyň çäginde. Sapaklary we interfeýsleri dizaýn etmek (Makalanyň terjimesi) - 2Dürli derejedäki görnüklilik sapaklara beýleki synplary ýa-da interfeýsleri görmäge mümkinçilik berýär ýa-da (mysal üçin, dürli paketlerde bolsa ýa-da biri-biriniň içinde höwürtgeleýän bolsa) ýa-da kiçi toparlara ene-atalarynyň usullaryny, gurluşykçylaryny we meýdanlaryny görmäge we girmäge mümkinçilik berýär. Indiki bölümde miras, muny hereketde göreris.

9. Miras

Miras, gatnaşyklar synpyny gurmak üçin esas bolup hyzmat edýän obýekte gönükdirilen programmirlemegiň esasy düşünjelerinden biridir. Görünmek we elýeterlilik düzgünleri bilen utgaşyp, miras sapaklary giňeldip we saklap boljak iýerarhiýa düzmäge mümkinçilik berýär. Düşünjeli derejede, Java-da miras kiçi synplar arkaly amala aşyrylýar we esasy synp bilen bilelikde açar söz giňeldilýär . Bir kiçi klas ene-atalar synpynyň ähli köpçülige we goralýan elementlerine miras galar. Mundan başga-da, kiçi klas ikisi (kiçi klas we synp) bir paketde bolsa, ene-atalar synpynyň paket-şahsy elementlerine miras galar. Bu aýdylanda, näme dizaýn etjek bolsaňyzam, bir synpyň köpçülige açýan iň az usullar toplumyna ýa-da kiçi toparlaryna ýapyşmak gaty möhümdir. Mysal üçin, göze görnüp duran derejeleriň we olaryň täsirleriniň tapawudyny görkezmek üçin synpa Parentwe onuň kiçi toparyna seredeliň .Child
package com.javacodegeeks.advanced.design;

public class Parent {
    // Everyone can see it
    public static final String CONSTANT = "Constant";

    // No one can access it
    private String privateField;
    // Only subclasses can access it
    protected String protectedField;

    // No one can see it
    private class PrivateClass {
    }

    // Only visible to subclasses
    protected interface ProtectedInterface {
    }

    // Everyone can call it
    public void publicAction() {
    }

    // Only subclass can call it
    protected void protectedAction() {
    }

    // No one can call it
    private void privateAction() {
    }

    // Only subclasses in the same package can call it
    void packageAction() {
    }
}
package com.javacodegeeks.advanced.design;

// Resides in the same package as parent class
public class Child extends Parent implements Parent.ProtectedInterface {
    @Override
    protected void protectedAction() {
        // Calls parent's method implementation
        super.protectedAction();
    }

    @Override
    void packageAction() {
        // Do nothing, no call to parent's method implementation
    }

    public void childAction() {
        this.protectedField = "value";
    }
}
Mirasyň özi gaty uly mowzuk, Java-a mahsus köp jikme-jiklik bar. Şeýle-de bolsa, ýerine ýetirmek aňsat we synp iýerarhiýasynyň tizligini saklamak üçin uzak ýol geçip bilýän birnäçe düzgün bar. Java-da, her kiçi klas gutarnykly diýlip yglan edilmedik halatynda ene-atasynyň miras galan usullaryny ýok edip biler. Şeýle-de bolsa, bulaşyklyga sebäp bolup biljek usuly ýokaşdyrmak diýip bellemek üçin ýörite sintaksis ýa-da açar söz ýok. Şonuň üçin @Override düşündiriş girizildi : haçan-da maksadyňyz miras galan usuly ýok etmek bolsa, ony anyk görkezmek üçin @Override düşündirişini ulanyň . Java döredijileriniň dizaýnda yzygiderli ýüzbe-ýüz bolýan başga bir kynçylyk, interfeýsleriň ýerine ýetirilmegine garşy synp iýerarhiýalarynyň (beton ýa-da abstrakt synplar bilen) gurluşygydyr. Mümkin boldugyça sapaklara ýa-da abstrakt sapaklara interfeýsleri ulanmagy maslahat berýäris. Interfeýsler has ýeňil, synamak we goldamak has aňsat, şeýle hem durmuşa geçiriş üýtgemeleriniň zyýanly täsirlerini azaldýar. Java standart kitaphanasynda proksi sapaklaryny döretmek ýaly köp ösen programma usullary interfeýslere köp bil baglaýar.

10. KÖP KÖP miras

C ++ we beýleki dillerden tapawutlylykda Java birnäçe mirasy goldamaýar: Java-da her synpda diňe bir göni ene-atasy bolup biler ( Objectiýerarhiýanyň ýokarsyndaky synp bilen). Şeýle-de bolsa, synp birnäçe interfeýsi amala aşyryp biler we şeýlelik bilen Java-da köp mirasa ýetmegiň (ýa-da simulirlemegiň) ýeke-täk usulydyr.
package com.javacodegeeks.advanced.design;

public class MultipleInterfaces implements Runnable, AutoCloseable {
    @Override
    public void run() {
        // Some implementation here
    }

    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
Birnäçe interfeýsi amala aşyrmak hakykatdanam gaty güýçlidir, ýöne köplenç ýerine ýetirişi gaýta-gaýta ulanmak zerurlygy Java-yň köp mirasa goldaw bermezligini ýeňip geçmegiň usuly hökmünde çuňňur synp iýerarhiýasyna getirýär. 
public class A implements Runnable {
    @Override
    public void run() {
        // Some implementation here
    }
}
// Class B wants to inherit the implementation of run() method from class A.
public class B extends A implements AutoCloseable {
    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
// Class C wants to inherit the implementation of run() method from class A
// and the implementation of close() method from class B.
public class C extends B implements Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
We ş.m. ... Javaaňy-ýakynda Java 8-iň çykmagy birneme usuly sanjym bilen birneme çözýär. Adaty usullar sebäpli interfeýsler diňe bir şertnamany däl, eýsem ýerine ýetirişi hem üpjün edýär. Şonuň üçin bu interfeýsleri amala aşyrýan synplar hem bu ýerine ýetirilen usullary awtomatiki miras alarlar. Mysal üçin:
package com.javacodegeeks.advanced.design;

public interface DefaultMethods extends Runnable, AutoCloseable {
    @Override
    default void run() {
        // Some implementation here
    }

    @Override
    default void close() throws Exception {
       // Some implementation here
    }
}

// Class C inherits the implementation of run() and close() methods from the
// DefaultMethods interface.
public class C implements DefaultMethods, Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
Birnäçe mirasyň gaty güýçli, ýöne şol bir wagtyň özünde howply guraldygyny ýadyňyzdan çykarmaň. Meşhur Almaz Ölüm meselesi, köp mirasy durmuşa geçirmekde esasy kemçilik hökmünde görkezilýär, döredijileri synp iýerarhiýalaryny gaty ünsli düzmäge mejbur edýär. Gynansagam, adaty usullar bilen Java 8 interfeýsleri hem bu kemçilikleriň pidasy bolýar.
interface A {
    default void performAction() {
    }
}

interface B extends A {
    @Override
    default void performAction() {
    }
}

interface C extends A {
    @Override
    default void performAction() {
    }
}
Mysal üçin, aşakdaky kod parçasy düzülmez:
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
Şu wagt Java-yň dil hökmünde obýekte gönükdirilen programmirlemegiň esasy ýagdaýlaryndan gaça durmaga synanyşandygyny aýtmak adalatly, ýöne diliň ösmegi bilen bu ýagdaýlaryň käbiri birden ýüze çykyp başlady. 

11. Miras we kompozisiýa

Bagtymyza, miras synpyňyzy düzmegiň ýeke-täk usuly däl. Köp döredijileriň pikiriçe, mirasdan has gowudyr. Bu pikir gaty ýönekeý: synplaryň iýerarhiýasyny döretmegiň ýerine, beýleki synplardan ybarat bolmaly. Geliň, bu mysala seredeliň:
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
Synp Vehiclehereketlendirijiden we tigirlerden (goşmaça ýönekeýlik üçin galan beýleki böleklerden) ybaratdyr. VehicleŞeýle-de bolsa, synpyň hem hereketlendirijidigini  aýdyp bolar , şonuň üçin ony miras ulanyp dizaýn edip bolar.
public class Vehicle extends Engine {
    private Wheels[] wheels;
    // ...
}
Haýsy dizaýn çözgüdi dogry bolardy? Esasy esasy görkezmeler IS-A (is) we HAS-A (öz içine alýar) ýörelgeleri hökmünde bellidir. IS-A miras gatnaşyklary: bir kiçi klas ene synpyň synp spesifikasiýasyny hem-de ene synpyň üýtgemegini kanagatlandyrýar. Klass klass) ene-atasyny giňeldýär. -A (is). ") Şonuň üçin HAS-A kompozisiýa gatnaşygy: bir synpda köp sebäplere görä HAS-A prinsipi IS-A-dan has gowy işleýän bir obýektiň eýesi (ýa-da öz içine alýar): 
  • Dizaýn has çeýe;
  • Model has durnukly, sebäbi üýtgeşiklik synp iýerarhiýasy arkaly ýaýramaýar;
  • Bir synp we onuň düzümi ene-atany we onuň kiçi toparyny berk baglanyşdyrýan kompozisiýa bilen deňeşdirilende gaty birleşdirilýär.
  • Bir synpda logiki pikirleniş otlusy has ýönekeý, sebäbi ähli garaşlylyklar bir ýerde. 
Her niçigem bolsa, miras öz ornuna eýedir we bar bolan dizaýn meseleleriniň köpüsini dürli usullar bilen çözýär, şonuň üçin ünsden düşürilmeli däldir. Obýekte gönükdirilen modeliňizi düzeniňizde bu iki alternatiwany ýadyňyzdan çykarmaň.

12. ENCAPSULATION.

Obýekte gönükdirilen programmirlemekde encapsulation düşünjesi, durmuşa geçirmegiň ähli jikme-jikliklerini (iş tertibi, içerki usullar we ş.m.) daşarky dünýäden gizlemekdir. Enkapsulýasiýanyň peýdalary durnuklylygy we üýtgemegiň aňsatlygydyr. Synpyň içerki durmuşa geçirilmegi gizlenýär, synp maglumatlary bilen işlemek diňe synpyň köpçülikleýin usullary arkaly ýüze çykýar (köp adam tarapyndan ulanylýan kitaphanany ýa-da çarçuwany ösdürýän bolsaňyz hakyky mesele). Java-da encapsulýasiýa görünmek we elýeterlilik düzgünleri arkaly gazanylýar. Java-da meýdanlary gönüden-göni açmazlyk iň oňat tejribe hasaplanýar, diňe meýdançalar we sazlaýjylar arkaly (meýdanlar gutarnykly bellenilmedik bolsa). Mysal üçin:
package com.javacodegeeks.advanced.design;

public class Encapsulation {
    private final String email;
    private String address;

    public Encapsulation( final String email ) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }
}
Bu mysal , Java dilinde JavaBeans diýilýän zady ýada salýar : adaty Java synplary konwensiýalar toplumyna laýyklykda ýazylýar, olaryň biri meýdanlara diňe getter we setter usullary arkaly girmäge mümkinçilik berýär. Miras bölüminde eýýäm belläp geçişimiz ýaly, encapsulation prinsiplerini ulanyp, synpda iň az mahabat şertnamasyny hemişe ýerine ýetiriň. Jemgyýetçilikde bolmaly däl zatlaryň hemmesi şahsy bolmaly (ýa-da çözýän meseläňize baglylykda goragly / bukja şahsy). Uzak möhletde üýtgeşmeler girizmezden (ýa-da iň bolmanda minimuma eltmezden) dizaýn erkinligini bermek bilen öwezini dolar. 

13. JEMLE .JI KLASLAR WE USULLAR

Java-da bir synpyň başga bir synpyň kiçi toparyna öwrülmeginiň öňüni almagyň bir usuly bar: beýleki synpy gutarnykly diýip yglan etmeli. 
package com.javacodegeeks.advanced.design;

public final class FinalClass {
}
Usul deklarasiýasyndaky  şol bir soňky açar söz, kiçi toparlaryň usulyň üstünden geçmeginiň öňüni alýar.
package com.javacodegeeks.advanced.design;

public class FinalMethod {
    public final void performAction() {
    }
}
Synpyň ýa-da usullaryň gutarnykly ýa-da ýokdugyny kesgitlemek üçin umumy düzgünler ýok. Jemleýji synplar we usullar giňelmegi çäklendirýär we synpyň miras galmalydygy ýa-da alynmaly däldigi, geljekde bir usulyň ýok edilmelidigi ýa-da ýokdugy barada öňünden pikir etmek gaty kyn. Bu, esasanam, kitaphanany döredijiler üçin möhümdir, sebäbi şuňa meňzeş dizaýn kararlary kitaphananyň ulanylyşyny ep-esli çäklendirip biler. Java standart kitaphanasynda jemleýji synplaryň birnäçe mysaly bar, iň meşhury String synpy. Irki döwürde, bu karar döredijileriň öz setirlerini durmuşa geçirmek üçin özleriniň “has gowy” çözgüdini tapmak synanyşygynyň öňüni almak üçin kabul edildi. 

14. Indiki näme

Sapagyň bu bölüminde Java-da obýekte gönükdirilen programmirleme düşünjelerini açdyk. Şeýle hem, käbir amaly düşünjelere degip, wagtyň geçmegi bilen diliň nähili ösendigini görüp, şertnama programmirlemesine tiz göz aýladyk. Sapagyň indiki bölüminde umumylyklar we olaryň programmirleme görnüşindäki howpsuzlyga bolan garaýşymyzy üýtgetmegi bilen tanyşarys. 

15. SÖCEGI KODYNY OWükläň

Çeşmäni şu ýerden göçürip alyp bilersiňiz - advanced-java-part-3 Çeşme: Synplary nädip dizaýn etmeli
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION