Книга: JavaScript. Учебник начального уровня

Первый класс

Первый класс

Долго думал, стоит ли в рамках этого опуса использовать классы. На практике я часто сталкивался с тем, что очень не просто бывает объяснить зачем они нужны. На первый взгляд, после переделки какой–то простой процедурно–ориентированной программы в объектно ориентированную, ну или попросту после выделения одного–двух классов, программа, как правило, начинает выглядеть даже сложнее. Я всё же попробую. Причём как обычно буду стараться говорить человеческим языком, а если и буду вводить какие–то термины, постараюсь их объяснять.

Собственно преимущества выделения классов должны всплывать и в следующих главах по ходу повествования. Тут я лишь вскользь об этом упомяну.

 Перейдём к делу, как я, кажется, уже говорил ранее, класс — это такая особенная переменная, которая может содержать другие переменные (поля), а также собственные функции (методы). В этой главе наша программа не научится делать ничего нового, при запуске произойдёт всё тоже самое, что и при запуске программы из прошлой главы. Изменился лишь сам код. Такое изменение программы называется рефакторингом.

Что же я поменял? Я выделил новый класс «minesClass» и перенёс туда часть переменных и функций. Для чего мне это понадобилось? Я решил отделить логику программы от её интерфейса. То есть класс «minesClass» ничего не будет знать о нашей таблице, однако он сам расставит бомбы при своём создании, а затем останется лишь их нарисовать.

Предлагаю читателю посмотреть на то, что получилось, а затем я всё–таки попытаюсь объяснить ему, что стало лучше.

<html>
<head>
head>
<script>
    function minesClass(aRowCount, aColCount, aMinesCount)
    {
       this.intRand = function(maxVal)
      {
        return Math.floor((maxVal?1) * Math.random() + 0.5) — 1;
}
      this.fillMines = function()
      {
        var res = new Array(this.rowCount * this.colCount);
        var mines = this.minesCount;
        while (mines > 0)
        {
          var n = this.intRand(this.rowCount * this.colCount?1);
          if (res[n] != 1)
          {
            res[n] = 1;
            mines--;
}
}
        return res;
}
      this.colCount = aColCount;
      this.rowCount = aRowCount;
      this.minesCount = aMinesCount;
      this.mines = this.fillMines();
}
    function initTable()
    {
      var mines = new minesClass(10, 10, 10);
      var tbl = document.getElementById(«tbl»);
      for(var i = 0; i < mines.rowCount; i++)
      {
       var row = tbl.insertRow(i);
       for(var j = 0; j < mines.colCount; j++)
       {
         var cell = row.insertCell(j);
         if (mines.mines[i * mines.rowCount + j] == 1)
           cell.innerHTML = '*'
         else
           cell.innerHTML = '.';
}
}
}
  script>
  <body onLoad = initTable();>
    <table ID = «tbl» BORDER = 2 width = 80% height = 80%>
    table>
body>
html>


Короче и понятнее, ничего лишнего. Сразу видно, что к чему относится. Представте, что у вас в программе есть таблица для игры mines и одновременно есть таблица для игры в точки. Довольно трудно будет сказать в этом случае, что значит переменная rowCount. А вот если написано mines.rowCount, сразу всё понятно.

Перейдём к функции minesClass. Это по сути и есть наш новый класс. В JavaScript класс — это просто функция, а чтобы создать новый экземпляр классна нужно перед вызовом функции написать слово new.

В этой функции мы инициализируем методы intRand, fillMines, colCount, rowCount, minesCount и mines. В JavaScript методы также могут быть полями. Например, так мы описываем новый метод intRand. По сути переносим его в класс minesClass.

       this.intRand = function(maxVal)
      {
        return Math.floor((maxVal?1) * Math.random() + 0.5) — 1;
}

Я бы прочитал это так: поле «intRand» соответствует (равно) функции, которая принимает максимальное значение в качестве единственного параметра и возвращает случайное целое число от нуля до этого числа.

Аналогичным образом мы переносим функцию fillMines, делая её методом класса minesClass. Параметры этой функции уже не нужны, так как у метода класса есть доступ к его полям. Следует только не забывать перед обращением к полям класса писать «this.». Например, this.rowCount, this.mines и так далее.

Надеюсь мне хотя бы примерно удалось рассказать про то, как можно создавать и использовать классы в JavaScript и даже показать, что это может сделать программу понятнее. Если не вышло — значит я плохо старался… Однако у меня ещё остаётся надежда, что дальше всё станет понятнее. Тут затрагивались довольно трудные для понимания вещи и если что–то осталось непонятным — ничего удивительного и ничего страшного.

Оглавление книги


Генерация: 0.076. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз