Найти тему
Programmer

Основы программирования. Коробки ссылки и указатели можно использовать совсем не хуже объектов с именем!

Здесь снова для вас публикую сверхважную тему программирования, где поясню, как можно полностью коробками (ссылками и указателями) заменить именные объектовые переменные практически без единого минуса. Вам об этом в мире точно никто не расскажет.

Так как всего существуют четыре способа доступа к объекту, то есть вызов объекта по имени, вызов объекта по ссылке, по указателю, вызов объектов через методы и операторы вроде new при создании, то альтернативой именному вызову объектов являются вызовы по ссылкам и указателям, то есть через коробки объектов. В С++ указатели или имена объектов являются предпочтительным способом обращения к объектам, тогда как в Java и C# все подточено под использование ссылок-коробок или классов, хотя в Java и C# присутствуют именные объекты, это структуры C# и примитивные "оберточные" типы Java , в C# вы структуры можете вызывать также по указателям, если по имени не устраивает, только нужно указать модификатор unsafe и компилятору указать о разрешении указателей.

Но какой минус использования коробок, то есть ссылок и указателей, перед именными объектами? Очень просто. Виртуальные коробки или ссылки и указатели могут указывать или содержать внутри себя одни и те же объекты. То есть вы, например, создаете любую стандартную коллекцию объектов в ссылках, то если вы ссылкам на элементы коллекции присвоите один и тот же объект, то у вас будет путаница в коллекции, ведь число ссылок или элементов коллекции будет превышать число объектов в этой коллекции.

Так что же делать? Элементарно! Нам нужно коробки (ссылки и указатели) сделать полностью идентичными именам переменных или объектов! И будет чудо! Перед вами открывается фантастический мир использования объектов в коробках без любых минусов по сравнению с обычными именными переменными. Вы даже не представляете, какие перед вами откроются волшебные возможности. А что для этого всего нужно? А просто соблюсти элементарных несколько пунктов использования объектов с коробками, которые я привожу ниже.

При использовании ссылок и указателей с объектами нужно:

1. Практически всегда создавать для объектов константные или неизменные навечно указатели и ссылки, то есть одна коробка навсегда для одного объекта по аналогии с обычным именем объекта, ведь вы обычно не изменяете имя переменной по ходу ее использования до конца области действия ее имени. Зачем вам кидать в коробку разные объекты? Одна коробка на всю жизнь объекта!

2. После уничтожения объекта почти сразу должны уничтожиться коробки или ссылки и указатели, это по аналогии со "сборщиками мусора" Java и C# , где класс GC уничтожает объекты через некоторое время, на которые больше не ссылается ни одна ссылка. Также в С++ работают "умные указатели" или Smart pointers , которые каждый по своему алгоритму уничтожают безымянные объекты, на которые больше нет указателей, они либо мгновенно стирают ненужные объекты, либо после промежутка времени, как у них прописано в алгоритмах класса.

3. Не присваивать никогда коробкам (указателям и ссылкам)_ значения-адреса других коробок, чтобы никогда две или три коробки не указывали на один объект, а у каждой коробки всегда до конца ее жизни и жизни ее объекта был только один свой объект!

4. Всегда всем коробкам при создании присваивать объекты копированием созданного нового объекта операторами new и копированием "=" и этим вы гарантируете почти всегда, что для каждой новой коробки всегда создается новый объект в абсолютно новой области памяти. Пример такого создания коробок и объектов к ним привожу ниже для C++, C#, Java.

string str = new string ("vasja"); // C#

String str = new String (); // Java

string* vasja = new string (); // C++

В первом случае C# создается коробка строки и в нее мгновенная ссылка на новый созданный объект закидывает его в коробку, новый объект строки "vasja" создается в абсолютно новом участке памяти, где нет никаких объектов. Теперь если коробку str не менять до конца жизни объекта и всегда в ней содержать данную неизменяемую строку "vasja", то переменная будет себя вести полностью как именная. Но со строками неудачный пример, ибо их объекты неизменяемы, а в ссылки строк обычно запихивают разные неизменяемые строки каждый новый раз.

Во втором примере Java все абсолютно также, то есть в коробку строки запихивается неизменный объект строки. В реале данные правила я привел не для неизменных строк, а для изменяемых объектов, то есть вы делаете неизменяемую ссылку или указатель на один объект на всю жизнь, а сам объект в ней меняете, после уничтожения объекта уничтожается и его коробка или коробка уничтожается перед уничтожением объекта.

В третьей строке С++ в коробку-указатель закладывается (копируется) мгновенный указатель на новую созданную строку оператором new , при этом по аналогии с Java и C# новый объект создается в новой области памяти. Разница С++ здесь в том, что оператор new возвращает адрес объекта в шестнадцатеричном целом виде, а Java и C# оператор new представляет ссылку на сам объект.

Теперь вы понимаете, что любую коробку в виде ссылок и указателей можно прикрепить к переменной и коробка вместе с объектом внутри будет себя вести абсолютно аналогично обычной переменной с именем, но только если вы сделаете константную коробку и навсегда в нее положите один объект до конца жизни коробки или объекта, то есть если вы выполните условия выше обозначенных четырех пунктов.

Представьте себе, какие дополнительные глобальные возможности перед вами открываются, когда вы указатели и ссылки (коробки) будете использовать в виде имен для обычных переменных. Для этого вам понадобится всего лишь сделать коробку константной и следить, чтобы до конца жизни коробки и объекта внутри нее между ними была постоянная связь. Взамен вы получаете возможность применять коллекции из коробок, классы и структуры из внутренних коробок и вообще везде применять коробки в виде переменных и ни о чем не беспокоиться, что две или три коробки будут указывать на один объект или пустой адрес.

Ну как? Вам нравится такая идея использования коробок? В конце концов, если вам понадобятся обычные коробки, в которые можно пихать разные объекты и эти коробки будут скакать по разным адресам памяти, то вы спокойно создадите отдельный такой тип коробок. Единственное при этом учесть, при создании такого типа коробок обозначьте их специальными именами! Таким образом, вы получаете еще один дополнительный глобальный тип данных для себя в виде константных коробок с постоянными объектами в их адресах!

Картинка в Telegraph для иллюстрации данной статьи:

Картинка. В чем отличия коробочных и безкоробочных объектов?

Это картинка, показывающая отличия коробочных и безкоробочных именных объектов, использование которых позволяет создать коробочные объекты, полностью идентичные именным безкоробочным объектам или переменным. Как видите из рисунка, у объекта без коробки обязательно должно быть имя (vasja) , которое ему заменяет коробку (petja), иначе будет явление потеря памяти , но в Java и C# вы защищены от потери памяти, так как класс GC или "сборщик мусора" автоматически удаляет объекты через некоторое время, на которых нет ни одной ссылки.

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

Вот и все! Запомните на всю жизнь данные материалы статьи, а если забудете, то зайдите сюда на канал dzen.ru/operator и снова перечитайте статью, ибо использование коробок в таком формате фантастически облегчает жизнь программисту. И я уверен, что даже этого вам в мире никто больше не скажет ни в одной книге и ни в одном блоге, так как у официальщины нет цели учить вас программированию.

Подписывайтесь, ставьте лайки и комментируйте...