Читаем Рефакторинг. Зачем? полностью

property X1: Integer read FX1 write SetX1;

property Y1: Integer read FY1 write SetY1;

property X2: Integer read FX2 write SetX2;

property Y2: Integer read FY2 write SetY2;

function CalculateLineLength: Double;

end;

function TLine. CalculateLineLength: Double;

begin

if not LengthCalculated then

begin

LineLength:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));

LengthCalculated:= True;

end;

Result:= LineLength;

end;

procedure TLine. SetX1(const Value: Integer);

begin

LengthCalculated:= False;

FX1:= Value;

end;

procedure TLine. SetX2(const Value: Integer);

begin

LengthCalculated:= False;

FX2:= Value;

end;

procedure TLine. SetY1(const Value: Integer);

begin

LengthCalculated:= False;

FY1:= Value;

end;

procedure TLine. SetY2(const Value: Integer);

begin

LengthCalculated:= False;

FY2:= Value;

end;

И так, что мы сделали. Мы добавили полям X1, Y1, X2, Y2 префик «F» и перенесли в private секцию. Префикс «F» — это стандартный, исторически сложившийся префикс для обозначения приватного поля (сокращение от Field, поле). После этого напрямую менять значения координат снаружи класса стало невозможно.

Параллельно, также в private секции мы создали набор функций SetX1, SetY1, SetX2, SetY2 для корректной установки соответствующих значений. Помимо своих непосредственных обязанностей, они также сбрасывают флаг LengthCalculated, чтобы при последующем обращении некорректная уже длина пересчиталась заново.

Для доступа к приватным полям снаружи — предусмотрены свойства. Строка «property X1: Integer read FX1 write SetX1;” означает, что мы свойство X1, при чтении которого будет возвращаться значение FX1 (то, что после ключевого слова read), а при записи — будет вызываться функция SetX1 (то, что после ключевого слова write).

Таким образом, запись: «X:= Line. X1» эквивалентна записи «X:= Line. FX1», а запись «Line. X1:= X» эквивалентна записи «Line. SetX1(X)».

<p><strong>Наследование</strong></p>

Долго решался, прежде чем начать эту тему, обычно она достаточно сложна для понимания. Не уверен, что мне удасться уложиться в одну главу, но не беда. Главное быть последовательным. Давайте не уходить далеко от геометрических примитивов. Создадим два класса. Класс, описывающий круг и класс, описывающий прямоугольник:

type

TCircle = class(TObject)

public

X: Integer;

Y: Integer;

D: Integer;

end;

TRectangle = class(TObject)

public

X1: Integer;

Y1: Integer;

X2: Integer;

Y2: Integer;

end;

Круг вполне описывается координатами центра (X, Y) и диаметром (D), а прямоугольник — двумя точками (X1, Y1 и X2, Y2).

Допустим у нас есть программа для рисования кругов и прямоугольников. Каждый раз, когда мы рисуем новый круг, он кладётся в массив Circles: array of TCircle, а когда рисуем новый прямоугольник, он кладётся в массив Rectangles: array of TRectangle.

Далее нам нужен код, который определит, находится–ли заданная координата внутри одного из нарисованных примитивов. Например, пользователь совершил клик мыши и нам нужно выделить приметив, если кликнули именно на него.

Заведём для этого в каждом классе функцию HitTest, которая будет возвращать True в случае, если наша точка находится внутри графического примитива и False в противном случае:

type

TCircle = class(TObject)

public

X: Integer;

Y: Integer;

D: Integer;

function HitTest(aX, aY: Integer): Boolean;

end;

type

TRectangle = class(TObject)

public

X1: Integer;

Y1: Integer;

X2: Integer;

Y2: Integer;

function HitTest(X, Y: Integer): Boolean;

end;

function TCircle. HitTest(aX, aY: Integer): Boolean;

begin

Result:= Sqrt(Sqr(X — aX) + Sqr(Y — aY)) <= D;

end;

function TRectangle. HitTest(X, Y: Integer): Boolean;

begin

Result:= (X1 <= X) and (X <= X2) and (Y1 <= Y) and (Y <= Y2);

end;

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных