Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Спецкурс. Занятие 2

Абстракции, контракты,
соглашения
Принцип абстракции

Абстракция данных – скрываем
детали структуры
Абстракция алгоритмов –
скрываем вспомогательные
функции
Принцип абстракции

Основная цель – улучшить
понимание системы на
разных уровнях
Побочный эффект –
заменяемость
реализации
Принцип абстракции

Абстрактный тип данных
(АТД) – описание данных и
алгоритмов (функций) для
манипулирования ими
Принцип абстракции

Примеры АТД:
Список (List)
Стек (Stack)
Очередь (Queue)
Дек (Deq)
Ассоциативный массив (Map)
Принцип абстракции

Движение программистской
мысли:
Машинный код
«Понятный» машинный код
(ассемблер)
«Понятный» ассемблер (Си)
Структурное программирование
Принцип абстракции

Движение программистской
мысли:
Процедурное и функциональное
программирование
Абстрактные типы данных
Принцип абстракции

Движение программистской
мысли:
Объектно-ориентированное
программирование
Функциональное
программирование (новый
уровень)
Контракты

Контракт функции –
спецификация, предусловие,
постусловие и инвариант
Контракты

Спецификация функции –
наименование, входные и
выходные параметры,
выбрасываемые исключения
Контракты

Контракт:
один из способов реализации
абстракции
ООП (Java)

Класс один из способов реализации
абстрактного типа данных
Метод класса функция, имеющая доступ ко
всем данным класса
ООП (Java)

Спецификация метода – то
же, что и спецификация
функции + уровень доступа
ООП (Java)

Контракт класса –
наименование, структура
наследования, набор
спецификаций публичных
методов
ООП (Java)

Интерфейс –
чистое описание контракта класса
В Java НЕТ множественного
наследования, есть реализация
нескольких интерфейсов
ООП (Java)

Пакет –
совокупность классов, либо
совместно решающих общую
задачу, либо дающих разные
реализации одного контракта
ООП (Java)

Принцип Единственной
обязанности (Single Responsibility)
– у контракта должно быть ровно
одно четкое предназначение
Признак нарушения –
невозможность подобрать
простое наименование
ООП (Java)

Сущности:
interface IFullName {

interface IEmployee {

String getFirstName();
String getLastName();

IFullName getFullName();
String getAddress();
String getWorkPhone();
String getHomePhone();

}
}
ООП (Java)
public class FullName implements IFullName {

public String getLastName() {
return lastName;
}

private String firstName;
private String lastName;

public void setFirstName(
final String firstName
){
this.firstName = firstName;
}

public FullName(
final String firstName, final String lastName
){
this.firstName = firstName;
this.lastName = lastName;
}

public void setLastName(
final String lastName
){
this.lastName = lastName;
}

public String getFirstName() {
return firstName;
}
}
ООП (Java)
public class Employee implements IEmployee {

public IFullName getFullName() …
public String getAddress() …
public String getWorkPhone() …
public String getHomePhone() …
public void setFullName(final FullName name) …
public void setAddress(final String address) …
public void setWorkPhone(
final String workPhone
)…
public void setHomePhone(
final String homePhone
)…

private String address;
private String workPhone;
private String homePhone;
public Employee() {
}
public Employee (
final FullName name,
final String address,
final String workPhone,
final String homePhone,
){
…
}

}
ООП (Java)

Сервисы:
interface Program {
void InitializeCommandStack();
void PushCommand(Command command);
Command PopCommand();
void ShutdownCommandStack();
void InitializeReportFormatting();
void FormatReport(Report report);
void PrintReport(Report report);
void InitializeGlobalData();
void ShutdownGlobalData();
}
ООП (Java)

interface IEmployeeCensus extends IListContainer {
void addEmployee(IEmployee employee);
void removeEmployee(IEmployee employee);
IEmployee nextltem();
IEmployee getFirstltem();
IEmployee getLastltem();
}
ООП (Java)
interface IEmployeeCensus {
void addEmployee(IEmployee employee);
void removeEmployee(IEmployee employee);
IEmployee getNextEmployee();
IEmployee getFirstEmployee();
IEmployee getLastEmployee();
}
public class EmployeeCensus implements IEmployeeCensus {
private IListContainer m_EmployeeList;
…
}
Соглашения

Соглашения (конвенции)
именования – правила
наименования всех элементов
разрабатываемой системы
Соглашения

Уровни соглашений (по
возрастанию важности):
язык
фреймворк (библиотека)
компания (команда)
проект
Соглашения

Именование классов:
не использовать слова-связки
порядок: объект, имя
существительное – суть контракта,
дополнения и определения
Идеальный вариант – одно слово
Соглашения

Для сущностей:
Employee, List, WebContext
Для сервисов:
ReportManager, ContextHolder
Плохо:
AdderAndSubtracter, MyClass,
Program
Соглашения

Именование методов:
не использовать слова-связки,
порядок: глагол, объект
действия, дополнения и
определения
Соглашения

Именование переменных:
не использовать слова-связки,
объект, представляемый
переменной, возможно с
определением
Избегать: однобуквенных имен и
сильных сокращений слов
Соглашения

Разделение слов:
либо camelCase, либо символ
‘_’ - зависит от соглашений
языка
Соглашения

Классы в Java: CamelCase, с
большой буквы
Методы и переменные в Java:
camelCase, с маленькой буквы
Пакеты в Java: одно слово с
маленькой буквы, первые 2
уровня – развернутый домен
Соглашения

Форматирование кода –
правила записи операторов и
других конструкций языка,
расстановки пробельных
символов и скобок для
улучшения читабельности
Соглашения

Помните:
код пишется только 10%
времени, а 90% времени его
читают
Документирование

Документирование кода –
написание комментариев к
классам, методам,
определениям и другим
конструкциям
Документирование

JavaDoc – утилита для сборки
документации к проекту в
формате HTML
Иногда так называют сами
комментарии к классам и методам
Документирование

Пример для класса:
/**
* Provides a company employee
* entity
*/
class Employee {
Документирование

Пример для метода:
/**
* Counts employees in a given container
* @param employeeContainer a container of employees
* @return a count of employees in a given container
*/
int countEmployees(
final EmployeeContainer employeeContainer
){
Документирование

Самодокументирующийся код
– код, являющийся
документаций сам себе и не
требующий пояснений в виде
комментариев
Документирование

Хорошо документированный
код – контракты
документированы JavaDoc (или
аналогом), тела методов –
самодокументирующийся код

More Related Content

Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2