Найти тему
Programmer

Основы программирования. Всего три типа передачи данных: приведение, копирование, передача под имя напрямую!

Оглавление

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

В мире всего три типа передачи типов данных

Итак, сам я начинал 10 месяцев назад изучать программирование по "традиционным" учебникам и блогерам, ибо других нигде нет, поэтому шел на ощупь по инстинктам и логике без полного понимания основ. Сейчас за эти 10 месяцев у меня накопилось уже столько знаний по основам, которых нигде не говорят, что пора их изложить обществу думающих людей по полочкам.

На данный момент в программах и вообще в реальности я нашел только три способа передачи данных, они в исходном коде используются везде и всегда. Запоминайте! 1. Передача объекта данных напрямую под имя. 2. Копирование данных из одного объекта со вставкой их в другой объект такого же типа. 3. Приведение (явное и автоматическое) объекта одного типа данных к целевому другому типу, полным аналогом приведения являются составные выражения из операций (например, арифметические типа a+b/c*d).

Еще укажу, что вся передача данных в языках программирования идет двумя способами-операторами, то есть в первом случае оператором "равно =" перекидываются данные справа налево, а во втором случае закидыванием параметров (по сути тоже оператор) в методы или функции и все их аналоги передаются данные в скобках внутрь тела этих методов или функций.

Внешне все три способа передачи данных бывают двух видов:

int a = b; // (1-ый способ передачи через оператор "=")

Method1 (34, 67.6, a); // (2-ой способ передачи - закинуть в метод)

Вот в двух данных примерах в первом случае значение переменной b копируется в переменную a такого же типа в языках программирования C/C++, С# , Java , то есть правый элемент передается неким образом в левый элемент. Укажу еще одну сверхважную деталь двух данных способов передачи, она касается типа данных всей операции.

При передаче данных первым способом тип данных для операции "="определяется левым элементом или операндом. Если правый элемент имеет другой тип данных, то производится его приведение (один из трех способов передачи данных) либо автоматом, либо явным приведением со скобками!

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

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

Приведения типов и составные выражения из операций - один из трех главных способов передачи информации!

Еще раз вернемся к двум строчкам примера программы выше, точнее ко второй строчке. В ней функция или метод Method1 вызывается по имени с передачей внутрь нее трех параметров. Первым параметром является целое число 34, вторым является дробное число 67.6 , а третьим параметром метода служит переданная в него переменная a целого типа, которая объявлена в первой строчке кода и в нее положено значение переменной b какого-то типа. Напомню, что применение изложенных выше принципов означает, что переменная b может быть целого типа и тогда ее значение скопируется (по алгоритму) справа налево, а если она будет любого другого типа, то произойдет ее неявное автоприведение к целому типу левого эл-та, но только в том случае, если это неявное приведение прописано в виде метода или функции в стандартной библиотеке целых типов (int) данных или функция неявного приведения прописана в вашем типе данных (в классе), которым является правый эл-т от "=" или закидываемый в метод эл-т.

Нужно понимать, что явное со скобками приведение (позже покажу) типов данных и неявное автоматическое приведение при передаче данных являются едиными сущностями по природе и одним из главных трех способов передачи данных! Добавим сюда к этим единым двум сущностям еще одну, которая по природе с ними полностью едина. Этой сущностью являются выражения со многими операциями, например, арифметические выражения ( типа 45+ 67.5 * a/ str1) являются единой сущностью со всеми приведениями типов! Позже я вам подробно объясню причину этого, запоминайте, вам этого никто в мире не расскажет.

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

В данной статье мы не будем подробно рассматривать три способа передачи данных, а я просто изложу их основу, что такой-то способ существует, а дальше мы уже подробно изучим все.

Копирование - второй из трех главных способов передачи информации!

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

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

При этом нужно всегда знать, что копирование для оператора "=" и для передачи данных в метод является по стандарту данных языков основной операцией по умолчанию, то есть оператор "=" всегда можно переопределить (или переопределить само копирование в C++) или в C# можно в скобках параметров метода дописать ref, out, in и тогда в метод значения переменных не будут копироваться, а будут передаваться напрямую (идиоты это называют "по ссылке").

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

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

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

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

Передача объектов данных напрямую под имя - третий из трех главных способов передачи информации!

Теперь о третьем способе передачи данных, который по моему обоснованному мнению является лучшим или одним из лучших, так как он не тратит лишних ресурсов ЭВМ и не создает лишних переменных в памяти. Смысл его заключается в том, что вы передаете напрямую этот же объект или переменную справа налево через "=" (переопределив оператор "=") или закидываете в метод параметром (в C # с модификаторами ref, in, out, в C++ слева от имен параметров пишете "&") и в итоге у вас всегда идет передача непосредственно самого объекта под какое-то имя, а не идет его копирование или его приведение!

Все три способа передачи данных на реальном примере

А сейчас вам все три способа передачи данных по сути поясню:

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

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

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

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

Передача данных всегда является двусторонней типа "источник-приемник"
Передача данных всегда является двусторонней типа "источник-приемник"

Да, великодушно извиняюсь, забыл об еще одном третьем способе передачи данных, он стоит особняком, то есть существуют два "операторных" способа передачи данных в коде с помощью оператора "=" или закидыванием параметров в скобках в функции и методы. Но есть еще один способ в программах...

Способ передачи данных извне захватыванием напрямую с тем же именем

Кроме передачи объектов двумя "операторными" способами с применением всех трех описанных выше принципов (копирования, приведения, напрямую), данные в коде можно передавать напрямую и без этих двух способов. То есть напрямую данные в функции и методы можно передавать извне без параметров или без скобок захватыванием данных переменных (объектов) внутрь тела метода с тем же именем.

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

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

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

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