Резюме
Във всяка една взаимозависимост е важно да има граници, общопризнати от всички участници. Като създавате библиотека вие задавате зависимост с потребителя – клиент-програмиста – който е друг програмист, строящ приложение или по-голяма библиотека.
Без правила клиент-програмистите биха могли да правят всичко с членовете на класовете, въпреки че вие може би бихте предпочели друго. Всичко е изложено на показ пред света.
В тази глава видяхме как класовете изграждат библиотеки; първо начинът по който група класове се пакетира в библиотека и второ начинът по който се управлява достъпът до класовете.
Оценено е че програмен проект на C започва да се проваля някъде между 50K и 100K реда големина понеже C има едно общо “пространство на имената”, така че започват колизии, причиняващи проблеми с управлението на проекта. В Java ключовата дума package, схемата за имената на пакетите и ключовата дума import позволяват пълен контрол на имената, така че въпросът за колизиите на имената лесно се заобикаля.
Има две причини да се управлява достъпът до членовете. Първата е да се държи клиентът далеч от нещата, които не прябва да пипа; инструментите които са необходими за вътрешните механизми на данновия тип, но не са част от интерфейса използван от потребителя. Така че правенето на методи и полета private е в служба на потребителя, който с това знае кое му трябва и не се занимава с другото. Това опростява и разбирането на класа.
Втората и по-важна причина е да се даде възможност на проектантът на библиотеката да промени вътрешностите без да се притеснява как това ще се отрази на приложните програми. Може да сте построили класа по един начин отначало и после да сте открили, че реконструкция на кода ще даде много по-голяма скорост. Ако интерфейсът и реализацията са добре разделени и защитени, това може да се направи без да се кара потребителят да пренапише своя код.
Спецификаторите на достъпа в Java дават ценни възможности за управление на създателя на класа. Потребителите на класа виждат точно какво да използват и какво могат да игнорират. По-важното, по-нататък, е че може да се осигури независимост на потребителите от реализацията на класа. Ако знаете това като създател на класове, може да променяте подлежащата реализация понеже е сигурно, че това няма да засегне потребителите — те нямат достъп до тази част въобще.
Като имате възможността да променяте реализацията в бъдеще не само може да си подобрявате кода, но също имате свободата да правите грешки. Без значение колко грижливо се планира и изпълнява винаги се правят грешки. Като знаете това, ще експериментирате повече, ще направите по-бързо по-хубав код и по-бързо ще си завършите проекта.
Public интерфейса на клас се вижда от потребителя, така че тази част е най-важно да се направи както трябва по време на анализа и проектирането. Даже и това дава възможност за промени. Ако не стане интерфейсът изведнъж, може да добавите методи, само няма да махате — тъй като може клиентът да ги е използвал.
-
Създайте клас с public, private, protected, и “приятелски” членове-данни и методи. Създайте обекти и вижте какви съобщения от компилатора ще получите като се опитате да използвате всевъзможните членове. Помнете че класовете в една директория са част от “пакет по подразбиране”.
-
Създайте клас с данни protected. Създайте друг клас в същия файл който манипулира protected данните в първия клас.
-
Създайте нова директория и редактирайте вашия CLASSPATH за да я включите. Копирайте P.class файла там и после сменете имената на файла, на P класа вътре и имената на методите. (Бихте могли да добавите оператори за извеждане за да проследите работата.) Създайте друга програма в друга директория която използва вашия клас.
-
Съъздайте следния файл в c05 директорията (предполага се че е на вашия CLASSPATH):
///: c05:PackagedClass.java
package C05;
class PackagedClass {
public PackagedClass() {
System.out.println(
"Creating a packaged class");
}
} ///:~
После създайте следния файл в различна от c05 директория:
///: c05:foreign:Foreign.java
package C05.foreign;
import C05.*;
public class Foreign {
public static void main (String[] args) {
PackagedClass pc = new PackagedClass();
}
} ///:~
Обяснете защо компилаторът генерира грешка. Би ли правенето на Foreign класа част от c05 пакета променило нещо?
6: Многократно използване на класове
Една от най-привлекателните черти на Java е многократното използване на кода. Но за да бъде революционно, трябва да можем много повече отколкото да копираме код и леко да го променяме.
Това последното е подходът в процедурните езици като C и то не работи много добре. Както всичко в Java, решението се върти около класовете. Пре-използвате кода чрез създаване на нови класове, но наместо да ги създавате изцяло наново, използвате съществуващи класове които някой вече е създал и тествал.
Трикът е да се използва съществуващ код без да се пипа. В тази глава ще видите два начина да се стори това. Първият е съвсем праволинеен: Просто създавате обекти от съществуващ клас вътре в даден клас. Това се нарича композиция понеже новият клас е композиран от старите. Просто използвате функционалността на кода, не формата му.
Вторият подход е по-изтънчен. Създава се нов клас от типа на съществуващ клас. Буквално взимате формата на съществуващ клас и добавяте код за разширяване на функционалността, без да се пипа съществуващия клас. Този магически акт се нарича наследяване и компилаторът върши повечето работа. Наследяването е крайъгълен камък на ООП и има и други употреби, които ще бъдат разгледани в следващата глава.
Оказва се, че повечето синтаксис и повезение са еднакви за композицията и наследяването (нищо чудно, понеже те са начини за добиване на нов тип от съществуващ). В тази глава ще научите за тези механизми за повторно използване на код.
Сподели с приятели: |