П2.4. Объектно-ориентированное программирование (ООП). — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

П2.4. Объектно-ориентированное программирование (ООП).

2020-04-01 124
П2.4. Объектно-ориентированное программирование (ООП). 0.00 из 5.00 0 оценок
Заказать работу

Зачем нужно? Чтобы экономит силы и использовать объектный код, сочиненный другими людьми. Сама Java -программа - это некий объект. Главное понятие в ООП - понятие класса. Это структура (сложный тип данных), объединяющая переменные и функции для работы с ними.

 

Класс "мыша"

Mouse{

x  // переменные внутри класса - "поля" или

y  //                        "свойства"

draw() // функция внутри класса = "метод"

}

Формальное описание синтаксиса класса:

class Name {

int x, y;

тело класса;

int Sum (int a, int b){} // описание функций

float z; // в любом порядке описание переменных и функций..

       // хотя для читабельности все лучше по порядку

}

Класс не похож на функцию, не возвращает никакого значения.

Тут используют описания доступа к переменным (полям то есть) класса и к его функциям (методам то есть). По умолчанию переменные и функции доступны для своего класса и всех его соседей в той же папке.

По сути класс - что это? Это сложная структура в памяти. Выделяем 4 байта для целого, 4 байта для вещественного, и описываем структуру функции для работы с ними. Но это лишь описание - реально память не выделена. Память выделяется реально - создается объект. То есть конкретный экземпляр класса. Я месяца три после процедурного программирования не мог привыкнуть к терминологии и не мог понять, зачем же это нужно! Попытаюсь вам объяснить все же побыстрее:-)

 

Класс "люди"

голова

руки

метод_думать (увеличивает значение голова на 1)

метод хватать (увеличивает значение рук на 1)

все

 

Мы все - объекты=экземпляры этого класса. Нам выделено место на земле чтобы жить, хватать и думать.

Внутри класса помимо всего прочего существует специальная функция - "конструктор" - называется функция тем же именем, что и класс (в этом примере - "люди"). Она может существовать или не существовать. Она не возвращает никакого результата и void к конструктору не надо приписывать. Она - функция-конструктор - нужна для некоторых начальных (инициализирующих) действий при создании объекта. Какие действия? Разные..

В нашем примере: конструктор присвоит головам и рукам значение "десять". Это я придумываю сам. Пусть будет так. Или пример с мышой: пусть мыша будет при инициализации располагаться в центре экрана. Кто-то должен вычислить координаты центра экрана и вызвать функцию рисования чтобы там мыша была нарисована.

Когда объект создается (человек рождается), то вызывается один-единственный раз конструктор. Если я не описал спец. конструктор, то что по умолчанию? Обычно ничего. Но если и ничего, все же по умолчанию конструктор есть. Хотя по умолчанию он ничего не совершает, ничего не возвращает, никаких аргументов не получает.

Вернемся к примеру Люди: создаем объект Миша класса Люди -

1) объявили переменную сложного типа "Люди" (так как мы писали int a;

при объявлении переменной простого типа)

 Люди Миша; // никакая память не выделилась, переменной

// спец_типа Люди - нет, ее "значение" - null

        // в отличие от случая простой переменной - она то

        // "инициализируется" автоматически

2) выделили оперативную память для объекта Миша:

Миша=new Люди();

Теперь возник кусок выделенной памяти - конструктор там создал структуру для хранения переменных руки, голова, функций-методов.

Разница с обычным программированием: функция делается менее универсальной. Она может работать только над данными данного объекта! Нельзя заставить функцию-метод объекта взять переменную другого объекта. (можно ей передать извне эти переменные-поля как аргументы). Зато (выигрыш) все это дело увязано в одну взаимосвязанную структуру. Еще раз: даже если метод-функцию вызвать снаружи, она чужие данные не сможет взять. А как же передают данные внутрь переменных-полей объекта? Прямой записью в поле или передачей данных внутрь через функцию-метод, ему эти данные дают в качестве аргумента.

Уничтожение объектов. В отличие от Си++ в Java нет Деструктора. Я пишу

Миша = null;

Объект "Миша" не сразу убивается-освобождает память. Он просто лежит тут, ненужный Миша. А потом, в момент регулярной чистки памяти, его уберут. Java -машина чистит память регулярно.


Приложение 3

 Листинг программы – SearchEngein.java

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.net.*;

import java.util.*;

import java.lang.*;

 

// Класс Интерфейс

public class SearchEngein extends HttpServlet {

 

// Объявление глобальных переменных

Properties INIProperties = new Properties();

 

String query = null, // Запрос

     value = null; // Запрос в нужной кодировке

String dbname, // Имя базы

  dbpath; // Путь к базе

String dbselect; //

 

 byte MD = 30, // Код разделителя

MD2 = 31; // Код разделителя

String RusDos = new String("Cp866"); // Кодировка дос

String RusWin = new String("windows-1251"); // Кодировка Виндовс

String iso = new String("8859_1"); // Кодировка Сервлета

String RusIso = new String("8859-5"); // Кодировка Исо

 

// конвертор кодировки из ИСО В Виндовс

private String ConvertISO(String Str) {

try {

Str = new String(Str.getBytes(iso),RusWin);}

catch(java.io.UnsupportedEncodingException e) { return Str;}

return Str;

}

 

 public String getServletInfo() {

return "Поиск в базе данных ";

 }

 

private String RemoveTrash(String str){

return new String(str);

}

 

// преобразование в нижний регистр

public String toLow(String str){

 

char old[] = str.toCharArray();

 

char news[] = new char[str.length()];

char c;

 

for (int i =0; i<str.length(); i++){

 c = old[i];

 switch (c) {

case 'А': {c = 'а';break;}

case 'Б': {c = 'б';break;}

case 'В': {c = 'в';break;}

case 'Г': {c = 'г';break;}

case 'Д': {c = 'д';break;}

case 'Е': {c = 'е';break;}

case 'Ё': {c = 'ё';break;}

case 'Ж': {c = 'ж';break;}

case 'З': {c = 'з';break;}

case 'И': {c = 'и';break;}

case 'Й': {c = 'й';break;}

case 'К': {c = 'к';break;}

case 'Л': {c = 'л';break;}

case 'М': {c = 'м';break;}

case 'Н': {c = 'н';break;}

case 'О': {c = 'о';break;}

case 'П': {c = 'п';break;}

case 'Р': {c = 'р';break;}

case 'С': {c = 'с';break;}

case 'Т': {c = 'т';break;}

case 'У': {c = 'у';break;}

case 'Ф': {c = 'ф';break;}

case 'Х': {c = 'х';break;}

case 'Ц': {c = 'ц';break;}

case 'Ч': {c = 'ч';break;}

case 'Ш': {c = 'ш';break;}

case 'Щ': {c = 'щ';break;}

case 'Ъ': {c = 'ъ';break;}

case 'Ы': {c = 'ы';break;}

case 'Ь': {c = 'ь';break;}

 

case 'Э': {c = 'э';break;}

case 'Ю': {c = 'ю';break;}

case 'Я': {c = 'я';break;}

default: {news[i]=c;}

 }// switch

 news[i] = c;

}

 return new String(news);

}

 

//

private String TagRemove(String s){

boolean inTag = false;

boolean tag = false;

int sn = 0;

char c;

int m = s.length();

char[] cd = new char[m];

char[] old = s.toCharArray();

char cMD = (char) MD2;

 

for (int i=0; i<m; i++)

 {c=old[i];

 if (tag) { c=' '; tag = false; }

 else if (c == cMD) { c=' '; tag = true;}

cd[i] = c;

 }

return new String(cd);

}

//

public void dbFileRead(String dbNamePath, PrintStream out, String query) {

 

 String mAvtor = null; // 100

 String msAvtor = null; // 700

 String mName = null; // 245

 String mPrinter = null; // 260

 String mSize = null; // 300

 String mKey = null; // 653

 String mSeria = null; // 490

 String mBBK = null; // 91

 String mKaIndex = null; // 90

 

 long fPosMarker = 0, // Позиция относительно начала

fPosData = 0; //

 boolean done = false,

    Avtor = false;

 int mC =0,

mE =0;      // Счетчик

 byte Jumper[] = new byte[5]; // Размер запяси - символьный

 int JIndex = 0, // Размер запяси - числовой

JTemp = 0, // Размер данных + словарь

MIndex = 0, // Счетчик для массива

MTemp = 0; // Счетчик полей

if (query!= null){

try { RandomAccessFile dbfile = new RandomAccessFile(dbNamePath,"r");

 

// Цикл чтения файла по маркерам

while (fPosMarker!= dbfile.length()) {

 

try { mC++;

       dbfile.seek(fPosMarker);

       dbfile.read(Jumper);

       String jBuf = new String(Jumper);

       JIndex = Integer.parseInt(jBuf,10);

         int b = 0;

// Поиск конца словаря

          while (b!= MD){

           dbfile.seek(fPosMarker+24+MIndex);

            b = dbfile.read();

           MTemp++;

           MIndex = MTemp;

           }

           MTemp= MTemp - 1;

// чтение Словаря из файла в отдельный массив

          byte Dic[] = new byte[MTemp];

           dbfile.seek(fPosMarker+24);

            dbfile.read(Dic);

// чтение полей данных из файла в массив

       fPosData = fPosMarker+24+MTemp;

         String sDic = new String(Dic);

          byte MarcRec[] = new byte[JIndex-24-MTemp];

          dbfile.seek(fPosData);

          dbfile.read(MarcRec);

          int DI2 = 0,

              DI3 = 0,

              DI4 = 0,

              DI5 = 0,

          PNum = 0, // Номер поля числовой

          PLength = 0, // Длинна поля числовая

          PStart = 0; // Начальная позиция поля чиловая

// сканирование номеров полей

          while (DI2!= MTemp){

           DI3=DI2+3;

           String DStr = sDic.substring(DI2,DI3);// Номер поля

           DI4=DI3+5;

           String DStr2 = sDic.substring(DI3,DI4);// Начальная позиция

           DI5=DI4+4;

           String DStr3 = sDic.substring(DI4,DI5);// Длинна поля

           DI2=DI2+12;

            PLength = Integer.parseInt(DStr3,10);// Узнаем длинну поля

            PStart = Integer.parseInt(DStr2,10);// Узнаем начало поля

            PNum = Integer.parseInt(DStr,10);// Код

            byte Pole[] = new byte[PLength];

// Чтение поля из файла

          for (int PIndex = 0; PIndex < PLength; PIndex++) {

            Pole[PIndex] = MarcRec[PStart+PIndex];

          }

            String Pol = new String(Pole);

            if (Pol == null) Pol=" ";

 

            switch (PNum) {

             case 100: { mAvtor = TagRemove(Pol.substring(5));break;}

             case 700: { msAvtor = TagRemove(Pol.substring(5));break;}

             case 245: { mName = TagRemove(Pol.substring(5));break;}

             case 490: { mSeria = TagRemove(Pol.substring(5));break;}

             case 91: { mBBK = TagRemove(Pol.substring(5));break;}

             case 90: { mKaIndex = TagRemove(Pol.substring(5));break;}

             case 260: { mPrinter = TagRemove(Pol.substring(5));break;}

             case 300: { mSize = TagRemove(Pol.substring(5));break;}

             case 653: { mKey = TagRemove(Pol.substring(5));break;}

             default: {}

            }// switch

          }// конец проверки полей

           if (mAvtor == null) mAvtor=" ";

           if (msAvtor == null) msAvtor=" ";

           if (mName == null) mName=" ";

           if (mPrinter == null) mPrinter=" ";

           if (mSize == null) mSize=" ";

           if (mKey == null) mKey=" ";

           MarcRecord Rec = new MarcRecord(mAvtor,

                                            msAvtor,

                                            mName,

                                            mPrinter,

                                            mSize,

                                            mKey,

                                            mSeria,

                                            mBBK,

                                            mKaIndex);

            if (Rec.rAvtor.indexOf(query)!= -1 ||

                 Rec.rsAvtor.indexOf(query)!= -1 ||

                 Rec.rName.indexOf(query)!= -1 ||

                 Rec.rKey.indexOf(query)!= -1)

                { mE++;

out.println("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+

"<tr bgcolor=\"#3399FF\">"+

"<td colspan=\"3\" class=\"text\">&nbsp;&nbsp;&nbsp;Автор:&nbsp;"+

"<font color=\"#000000\">"+

Rec.rAvtor+" "+

Rec.rsAvtor+

"</font></td></tr><tr>"+

"<td colspan=\"3\" class=\"bodytext\">"+mE+". "+mC+

"&nbsp;<b>Название:</b>&nbsp;"+

Rec.rName+"<br>"+

Rec.rPrinter+" "+

Rec.rSize+"<br>"+

Rec.rBBK+" "+

Rec.rKaIndex+" "+

Rec.rSeria+

"</td></tr></table>");

}

       fPosMarker = fPosMarker+JIndex;

       MTemp = 0;

       MIndex = 0;

      }

  catch (IOException e) {

                 out.println("Ошибка!!!"+"<br>");

                 done=true; }

}

 }

 catch (IOException e) { out.println("Ошибка доступа к "+dbNamePath); }

 if (mE == 0) {

out.println("Запос: "+query+" не найден");

}

} // end If

}

// Ридер файла настройки

public void INIFile(String filename, String directory, PrintStream out) {

DataInputStream inifile = null;

String path = null,

iniRecord = null,

section = null,

vname = null,

vvalue = null;

boolean done = false;

int equalIndex = 0;

//

if (filename.length() == 0) {

out.println("IOError ");

System.exit(0);

}

if (directory.length() == 0) { directory = new String("c:\\www\\db"); }

if (filename.indexOf(".") < 0) { filename = new String(filename+".ini"); }

path = new String(directory+System.getProperty("file.separator")+filename);

// открытие файла

 try { inifile = new DataInputStream(new FileInputStream(path)); }

 catch(FileNotFoundException e) {

  out.println(filename+"not found");

System.exit(0);

}

// чтение файла

 try { iniRecord = inifile.readLine(); }

 catch (IOException e) { done=true; }

 while (!done && iniRecord!= null)

{ if (iniRecord.startsWith("["))

{ section = iniRecord.substring(1,iniRecord.lastIndexOf("]"));}

else if (!iniRecord.startsWith(";"))

    { equalIndex = iniRecord.indexOf("=");

      if (equalIndex > 0)

      { //Имя ключа => Раздел.ключ

        vname = new String(section+"."+iniRecord.substring(0,equalIndex));

        vvalue = new String(iniRecord.substring(equalIndex+1));

       INIProperties.put(vname, vvalue);

           

      }

    }

 

try { iniRecord = inifile.readLine(); }

catch (IOException e) { done=true; }

 }

}

 

// извлечь значение

 public String getINIVar(String key, String defValue) {

return INIProperties.getProperty(key, defValue);

 }

// извлечь значение

 public String getINIVar(String key) {

return INIProperties.getProperty(key);

 }

public void init(ServletConfig conf) throws ServletException {

super.init(conf);

}

public void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException

{

 

PrintStream out;

out = new PrintStream(res.getOutputStream());

res.setContentType("text/html; charset=Cp866");

// Печать заголовка

printPageHeader(out);

INIFile("db.ini","c:\\www\\db",out);

// Определяем кодировку

String requestEnc = req.getCharacterEncoding();

String clientEnc = requestEnc;

if (requestEnc==null) requestEnc=iso;

requestEnc=iso;

// Тело

out.println("<body bgcolor=\"#FFFFFF\">");

out.println("<form method=\"get\" action=\"/serv/SearchEngein\">");

out.println(" <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");

out.println(" <tr bgcolor=\"#3399FF\"> ");

out.println(" <td class=\"text\">&nbsp;&nbsp;&nbsp;Запрос</td>");

out.println(" <td class=\"text\">&nbsp;&nbsp;&nbsp;Каталог</td> ");

out.println(" <td width=\"207\">&nbsp;</td>");

out.println(" </tr>");

out.println(" <tr>");

out.println(" <td ");

out.println("   <input type=\"text\" name=\"Query\" maxlength=\"100\" size=\"38\" value=\"\">");

out.println(" </td>");

out.println(" <td ");

out.println("   <select name=\"select\" size=\"1\">");

out.println("     <option value=\"MARCFILE.Book\" selected>"+ConvertISO(getINIVar("KATALOG.Book"))+"</option>");

out.println("     <option value=\"MARCFILE.Stat\">"+ConvertISO(getINIVar("KATALOG.Stat"))+"</option>");

out.println("     <option value=\"MARCFILE.Periud\">"+ConvertISO(getINIVar("KATALOG.Periud"))+"</option>");

out.println("     <option value=\"MARCFILE.Podpis\">"+ConvertISO(getINIVar("KATALOG.Podpis"))+"</option>");

out.println("     <option value=\"MARCFILE.Ucheb\">"+ConvertISO(getINIVar("KATALOG.Ucheb"))+"</option>");

out.println("   </select>");

out.println(" </td>");

out.println(" <td ");

out.println("   <input type=\"submit\" name=\"Start\" value=\"Поиск\">");

out.println(" </td>");

out.println(" </tr>");

out.println(" </table>");

out.println(" </form>");

// Конец тела

// Взять текст из строки

query = req.getParameter("Query");

 if (query == null || query.length()<1)

 {

printPageFooter(out);

return;

}

dbselect = req.getParameter("select");

value = new String(ConvertISO(query));

// Чтение файла

dbFileRead(getINIVar(dbselect), out, value);

// Распечатка результата

printPageFooter(out);

query = null;

value = null;

}

 

// Вывод заголовка документа

private void printPageHeader(PrintStream out) {

out.println("<html>");

out.println("<head>");

out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Cp866\">");

out.println("<style type=\"text/css\">");

out.println("<!--");

out.println(".text { font: bold 12px Arial, Helvetica, sans-serif; color: #0000FF; text-decoration: none; text-align: left; }");

out.println(".bodytext { font: 12px Arial, Helvetica, sans-serif; color: #000000; text-decoration: none; text-align: left; }");

out.println("-->");

out.println("</style>");

out.println("</head>");

}

 

private void printPageFooter(PrintStream out) {

 out.println("</body>");

 out.println("</html>");

 out.flush();

}

 

}

 

// Класс Запясь для хранения данных считаных из запяси

class MarcRecord {

 protected String rAvtor; // Поле автор

 protected String rsAvtor; // Поле соавтор

 protected String rName; // Поле название произведения

 protected String rPrinter; // Поле издатель

 protected String rSize; // Поле Объем издания

 protected String rKey;  // Поле ключевые слова

 protected String rSeria;

 protected String rBBK;

 protected String rKaIndex;

MarcRecord(String r1,

         String r2,

         String r3,

         String r4,

         String r5,

         String r6,

         String r8,

         String r11,

         String r12) {

 

rAvtor = r1;

rsAvtor = r2;

rName = r3;

rPrinter = r4;

rSize = r5;

rKey = r6;

rSeria = r8;

rBBK = r11;

rKaIndex = r12;

}

}


 

Приложение 4

Результаты тестирования программы

Тестирование программы проводилось на 4 массивах данных размером 1000, 5000, 8366, 10000 записей. Метод тестирования заключался в поиске последней записи массива по уникальному названию, чтобы определить время поиска по всему массиву. Полученные данные приведены в таблице и на основе данных построен график (см. график).

 

График


Поделиться с друзьями:

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.205 с.