3 столпа объектно-ориентированного программирования: наследование, полиморфизм и инкапсуляция. Моим первым шагом в качестве разработчика было получение «Headfirst Java 2nd edition» от Goodwills. Каждый раз, когда я сталкиваюсь с техническими трудностями программирования, я вспоминаю первую прочитанную книгу по программированию. Мне, как новичку, было так сложно понять, что мне пришлось перечитывать книгу несколько раз, чтобы понять ее. Можно сказать, что это была одна из книг, которая прежде всего обучала объектно-ориентированному программированию.

В Java большинство опытных разработчиков, с которыми я разговаривал, уделяли большое внимание инкапсуляции. Итак, что такое инкапсуляция? Проще говоря, инкапсуляция — это, по сути, «предоставление вашим клиентам только того, что им нужно, и ничего более». Что это значит в программировании? Вы хотите получить или изменить информацию о переменной экземпляра? Поговори с моими геттерами и сеттерами. Некоторые методы должны помогать другим моим методам, а не вам.

```
public class TicTacToe{
private char boardArray[] = {' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' '};

public setBoardArray(int[] array){
if(boardIsRight(array))
boardArray = array
}
}
` ``

По сути, в Java вы не трогаете boardArray, если не вызываете setBoardArray, а доступ к заданному массиву осуществляется с помощью другого закрытого метода, вызывающего boardIsRight. Так зачем прилагать все эти усилия, чтобы сделать что-то публичным или приватным? Вопрос должен заключаться в том, насколько безопасно вы себя чувствуете, оставив своего ребенка в руках незнакомца? Не думаю, что кто-то в здравом уме это сделает. Как разработчики, учитывая огромное количество компаний, которые используют аутсорсинговых программистов, есть вероятность, что тот, кто играет с вашим кодом на другой стороне, — это кто-то, кого вы не видели и не слышали.

```
b.boardArray = ['x', 'x', 'x', x', 'x', 'x', x', 'x', 'x',]
```

Вышеприведенный пример устанавливает доску Tic Tac Toe на Java, которая является «общедоступной». Теперь, если вы понимаете, насколько это опасно в Java, просто подумайте о ruby. Java — это язык строгого типа, где пример boardArray должен быть массивом символов строгого размера 9. В Ruby вы можете легко превратить boardArray в строку, целое число или любой объект по вашему выбору. К счастью, в Ruby есть множество основных защитных механизмов. Локальные переменные, переменные экземпляра или класса доступны только геттерам и сеттерам в Ruby.

Вопрос в том, как часто люди программируют с учетом безопасности? Представьте, что у вас есть класс Dog для создания объектов собаки с атрибутами имени, возраста и размера. Размер собаки на экране будет увеличен на 7 пикселей на единицу атрибута размера. Вы когда-нибудь останавливались и думали, что страшнее: атрибут Size со значением 7 миллионов, -15 или текстовый файл? Важно, что этот потенциальный поток очень реален, если каждый раз, когда вы кодируете, вы используете attr_accessor только для предоставления вам своих геттеров и сеттеров.

```
Класс Dog
def initialize(name,size,breed) #public method
end #accessible

protected #sytnax для защищенного метода
def bark #защищенный метод
end #доступен, только если self.is_a?(собака.класс)

private #синтаксис для закрытого метода
def render_size #private method
end #доступно только в контексте текущего объекта
end
```

Я часто полагаю, что дело не в том, знаем ли мы, как использовать инкапсуляцию, а в том, почему мы должны ее использовать. С другой стороны, вы должны лечить любого другого программиста, который также может убить вашего ребенка. Мы хотим защитить безопасность наших программ (или ребенка) и нашей карьеры программиста (или родительства), но не позволять этому превратиться в ОКР. Должен быть здоровый баланс между оптимизацией разработки и безопасностью. Обеспечьте то, что необходимо для беспрепятственного движения, защитите от потенциальных опасностей и сохраните самое необходимое в тайне.