You are on page 1of 13

Дізнатися: процедурний та функціональний підходи, чому вони менш

ефективні за ООП.
Java – об'єктно-орієнтована мова. Це означає, що ми конструюємо
програму як набір взаємодіючих, але щодо автономних елементів – об'єктів.
Переваги: автоматичне управління пам'яттю (наявний "збирач сміття"),
кросплатформність та переносимість програм (може виконуватися на будь-
якому обладнанні та ОС) завдяки JDK.

JDK – Java Development Kit – це набір інструментів для написання,


компіляції, налагодження та виконання коду. Він містить наступні
інструменти:

 Інтерпретатор - java
 Компілятор javac
 Архіватор jar
 Генератор документації javadoc
 JRE - стандартна бібліотека мови.

JRE – Java Runtime Environment – набір бібліотек та програм для запуску


програм, написаних на Java. Тут нам цікаво знати, що JRE містить JVM –
віртуальну Java-машину.
JVM – Java Virtual Machine – віртуальна машина Java, яка відповідає за
виконання програми рядок за рядком. Працює лише з байт-кодом. Тобто,
перед виконанням програми нам потрібно скомпілювати її.
Компіляція - це процес перетворення вихідного коду програми (ви пишете
його в .java файлах) у зрозумілий Java-машині формат - байт-код.
НАВІГАЦІЯ У КОМАНДНОМУ РЯДКУ

Для Windows: Щоб вийти в корінь диску С – у командному рядку вводимо


cd /, щоб перейти з диска С до папки – вводимо cd та шлях до папки

Писати великі програми у такий спосіб дуже незручно. Тому програмісти


використовують Integrated Development Environment (IDE) – середовище
розробки з потрібними інструментами.

Ознайомитись – https://www.jetbrains.com/help/idea/mastering-keyboard-
shortcuts.html

Клас - це базова будівельна одиниця в Java. Велика програма складається


із класів, які взаємодіють між собою. Будь-який код, який ми пишемо, ми
повинні писати всередині класів. Все, що між фігурними дужками,
називається тіло класу.

Коментар документації (javadoc comment):

/**
*
*
*/

void - це ключове слово означає, що метод робить якусь роботу, але нічого
не повертає. Якби метод щось рахував (наприклад, додавав два числа), ми б
писали не void, а тип даних, що повертається.
public - це модифікатор доступу, означає, що метод доступний усім, хто
має доступ до цього класу. Є також модифікатори private, protected та
package-access (тоді не пишемо нічого).
Сигнатура методу - це повне ім'я методу зі списком аргументів, які
приймає цей метод. В нашій програмі повинен бути принаймні один клас, де
є метод main (тобто з сигнатурою main). Цей клас ми зможемо передати java-
машині для виконання.
Ось деякі спецсимволи, що впливають на зовніщній вигляд тексту, з
описом їхньої дії:
 \t - Символ табуляції. Надрукується кілька (як правило 4) пробіли.
 \n - Перехід на новий рядок. Після цього символу увесь текст
друкуватиметься на наступному рядку.
 \’ - Символ одинарної лапки;
 \” - символ подвійної лапки;
 \\ - Символ зворотної скісної риски ().

Частіше використовується System.out.println. Але і метод


System.out.print використовується, особливо якщо нам потрібно якимось
особливим чином форматувати текст.
За статистикою приблизно 90% часу програмісти читають написаний
код, і лише 10% часу пишуть новий. Саме тому так важливо звертати увагу
на чистоту та правильність написання коду. Щоб структурувати роботу
програмістів, корпорація Oracle розробила угоди про написання вихідного
коду – https://www.oracle.com/technetwork/java/codeconventions-150003.pdf
Як приклад, абревіатури варто використовувати лише у разі крайньої
необхідності. Якщо ім'я класу, змінної, методу більше, ніж кілька слів, і
виходить дуже довге ім'я. Або якщо абревіатура загальноприйнята
(наприклад, HTML).
Методи – Camel Case, так само, як і змінні
Пакети іменуються повними словами і лише літерами нижнього
регістру. Цифри в назві пакета не варто застосовувати.

У реальному житті над проектом працюють десятки і навіть сотні


людей. Їхню роботу треба якось синхронізувати. Для цього вигадали
спеціальні інструменти, які називаються системи контролю версій.
Системи контролю версій допомагають уникнути помилок під час
внесення змін до програми відразу багатьма людьми, а також необхідні для
роботи над проектом.
Git – це розподілена система контролю версій (version control system –
VCS). Контроль версій означає, що ви зберігаєте всі версії редагованих
документів і можете повернутися до будь-якої збереженої версії в будь-який
момент часу. Здається, ніби такий підхід популярний лише серед
програмістів, але насправді ним користуються, наприклад, дизайнери та
архітектори. Розподіленість git’а відрізняє його від інших vcs. Під
розподіленістю варто розуміти, буквально, можливість використання однієї
системи контролю на проекті багатьма розробниками. Є ще централізовані
системи контролю версій, наприклад SVN. Але вони менш зручні при роботі
великої групи розробників, і набагато рідше використовуються.
Репозиторій – це папка у вас на комп'ютері (і також можливо на
якихось віддалених серверах), де зберігаються файли вашого проекту. Git
спостерігає за цією папкою, і коли ви змінюєте там якісь файли, він позначає
це в себе. Якщо ви припускаєтеся якихось помилок, ви завжди можете
повернутися на один або кілька кроків назад, і подивитися стан потрібного
файлу на момент часу без помилок.
Папка .idea та конфігураційні файли із розширенням типу .iml. не
потрібні нам для роботи з проектом, тому немає необхідності їх закидати в
загальний репозиторій - вони тільки заважатимуть нам.

Staging area - це спеціальна область – список файлів, які попадуть у


наступний знімок стану вашого проекту (комміт).

Додаткові посилання – https://habr.com/ru/post/432420/,


https://proglib.io/p/git-github-gitflow
Іноді хочеться спробувати написати і запустити невеликий шматочок
коду, але немає комп'ютера з налаштованим середовищем Java. У такому разі
можна використовувати REPL. Це спосіб написання коду, скорочення з англ.
read-eval-print loop - «цикл „читання - обчислення - виведення“». REPL
зручний для написання невеликих шматочків коду для тестування окремих
конструкцій мови.
https://replit.com/languages/java10

Змінні можна і не ініціалізувати спочатку. Але хорошою практикою


вважається оголошення та одночасна ініціалізація змінної – так код простіше
читається.
Reference dataa types – classes, massives, strings
Java має такий поділ, тому що примітивні типи даних займають мало
місця, і робота з ними швидка. Посилальні типи даних потужніші і зручніші,
але працюють повільніше. Тому поділ на різні групи даних зроблений з
метою оптимізації програм.

Уявіть, що ви впустили клубок ниток, він кудись закотився, але у вас


залишився кінчик нитки. Якщо ви будете слідувати за цією ниткою, ви
знайдете клубок. По факту, у вас було посилання (нитка), а за ним ви
знайшли дані (клубок). Коли програмі потрібні дані, вона бере посилання, і
за цим посиланням в купі шукає дані.

Мінімальний обсяг інформації, якою оперує комп'ютер – це саме байт.


Тобто читання-запис даних здійснюється саме байтами. Тому, коли ми
пишемо програму, яка безпосередньо взаємодіє з "залізом" (мікроконтролери,
пристрої для розумного будинку), ми часто використовуємо тип даних byte.

Примітивний тип float ніколи не варто використовувати для точних


значень, наприклад, у роботі з валютою. У таких випадках прийнято
використовувати екземпляри класу java.math.BigDecimal.
float f4 = .5f; //Так, і так теж можна – це аналогічно запису 0.5f
char - це тип даних, що зберігає окрему літеру, цифру, або інший знак -
символ. Із ними можуть здійснюватись математичні обчислення.
Кодування символів – одна з великих проблем у програмуванні.
Кодувань існує багато, різні країни використовують різні кодування. І текст,
записаний в одному кодуванні, виглядає зовсім інакше в іншому кодуванні.
Стандарт де-факто зараз – кодування UTF-8.

Оператори – це спеціальні символи, які виконують специфічні операції


над операндами та повертають значення. Тобто операнди - це елементи, над
якими виконується операція.

На відміну від запису a = a + 2, у випадку запису a + = 2 не буде


працювати приведення типів. У першому випадку 2 буде сприйнято
компілятором як int, що може спричинити помилку компіляції, якщо тип a
був, наприклад, byte.
Для порівняння об'єктів є метод equals, з яким ми познайомимося в темі
про класи.

ЛОГІЧНЕ АБО: Ми будемо читати увечері книгу, якщо є електричне


освітлення або, якщо у нас є свічка. Достатньо хоча б одного потрібного нам
фактора.
ЛОГІЧНЕ І: Ми підемо гуляти, якщо у нас є вільний час І на вулиці
гарна погода. Якщо обидва фактори співпали – тільки тоді йдемо гуляти.
Є також оператори & та |. Вони працюють аналогічно операторам &&
та ||, але завжди обчислюється весь вираз - без лінивості.
Є спеціальний метод, equalsIgnoreCase(), який порівнює рядки без
врахування регістру. Можна дізнатися, скільки символів у рядку,
використовуючи метод length(). Він повертає ціле число – кількість символів.
Привести рядок до верхнього регістру - це зробити всі літери в рядку
ВЕЛИКИМИ. Для цього використовується метод toUpperCase().
Привести рядок до нижнього регістру - це зробити всі літери
маленькими. Для цього використовується метод toLowerCase().
Іноді потрібно дізнатися, чи є певний рядок частиною іншого рядка.
Для цього є метод contains().
Рядок, по суті – це набір символів. Кожен символ має позицію - індекс,
індекс першого елемента - 0. І є спеціальний метод, який дозволяє отримати
символ на певній позиції - charAt()
startsWith(), endsWith(), isEmpty(), isBlank(), replace(), trim(), strip(),
substring() – ознайомитись.

У Java сувора типізація. Це означає, що перед використанням змінної


необхідно явно вказати її тип. Але, якщо компілятор однозначно може
зрозуміти тип локальної змінної під час ініціалізації, ми можемо замість типу
змінної зліва, написати слово var. Можливість використовувати var з'явилася
з Java 10. var - це не ключове слово, тому ви можете технічно назвати змінну
var, хоча робити так не рекомендується. Використовувати var варто тоді,
коли це не погіршує читабельність коду. Не можна використовувати var,
коли компілятор не може вивести тип (тобто із null)

About var – https://habr.com/ru/post/438206/

Кожна змінна в Java-програмі видима лише в обмеженому місці. Це


називається область видимості змінної. Змінні, оголошені в класі,
називаються поля класу (class fields). Такі змінні видно скрізь в межах
класу:Змінні, оголошені в класі, називаються поля класу (class fields). Такі
змінні видно скрізь в межах класу: public static final String NAME = "John
Doe";
Також є область видимості в методі, і свій блок видимості, оголошений
{}.
Області видимості утворюють ієрархію. Змінні, оголошені у верхній
області видимості, доступні нижній області видимості, але не навпаки.

Коли ви пишете складні умови, і відчуваєте, що ваш код виглядає складно -


подумайте, чи можна його спростити, використовуючи, у тому числі паттерн
Guard Clause.

Тернарка: помилкою буде писати тернарний оператор без присвоєння


будь-чому. Також обидва значення, що повертаються, повинні бути одного
типу (наприклад, double і long після ? та : - помилка компіляції). Тернарний
оператор зручно застосовувати у коротких однорядкових методах. Якщо
умова і значення тернарного оператора, що повертається, починають
виглядати складно, значить настав час повертатися нехай до довших, але
читабельніших умов. Не варто надто захоплюватися тернарними
операторами. Найкращий код – простий код. Що простіший і зрозуміліший
ваш код, то професійнішим він є. Складний та заплутаний код – ознака
недосвідченого програміста.
Switch-case – хороша читабельність коду. Пропущене слово break в switch-
case часто є причиною помилок. Майже завжди потрібно писати break після
кожного case. Якщо ви не пишете це слово – ви повинні мати вагому причину
для цього.
Будь-який оператор switch-case можна замінити набором if-else. Але не
кожен набір if-else можна замінити оператором switch-case. «Кейси»
ґрунтуються лише на константних значеннях. За сукупністю причин,
викладених вище, не рекомендується застосовувати (за дуже рідкісним
винятком) «кейси» на практиці у своїй роботі. Варіант, коли виправдано
використовувати switch-case – коли ви працюєте зі значеннями типу enum.
Ми ознайомимося з цим типом даних у наступних розділах.
Кожен клас має метод toString(). Цей метод повертає рядок, який представляє
об'єкт у зручному для програміста вигляді. Виведення об'єкта в консоль
настільки популярна операція, що розробники мови запровадили цей метод
toString(), і програміст може перевизначити цей метод.

Масив – це об'єкт, який містить фіксовану кількість значень одного типу.


Щоб оголосити масив, до або після імені змінної потрібно написати
квадратні дужки []:
int[] apples; //Правильне оголошення масиву
int apples[]; //Теж правильне оголошення
Щоб ініціалізувати масив, ми використовуємо оператор new. Цей оператор
виділяє пам'ять для масиву.
Якщо ми точно знаємо, які елементи зберігаються в масиві під час створення
цього масиву, ми можемо записати ініціалізацію масиву за допомогою
фігурних дужок {}, де через кому ми перелічуємо елементи масиву
Часта операція – отримати останній елемент масиву. Для цього ми беремо
довжину масиву і віднімаємо від цієї довжини одиницю:

char[] letters = {'a', 'b', 'c'};


char lastLetter = letters[letters.length - 1]; //Індекс - 2, значення - 'c'

Довжина масиву в Java зберігається у змінній типу int. Таким чином, 2 147
483 647 - це максимальна довжина масиву.

Можна створювати масиви в масивах


Розв’язати ще раз. Чому counter <= prices[prices.length - 1] – це було
неправильно?
І що це за рішення?
public class UberShop {
    public void printPrices(float[] prices) {
        for(float price: prices) {
            System.out.println(price + " jup.");
        }
    }

You might also like