LINUX.ORG.RU

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

 , ,


1

2

В своей основе вопрос сжатия это принцип Дирихле: вот у нас строки большого размера, их больше, вот у нас строки меньшего размера, их соответственно меньше. количество клеток не совпадает с количеством голубей, ничего не получается, все расходимся? А вот и нет, можно добиться равенства, причем двумя путями: или меньше голубей, или больше клеток.

1)меньше голубей: Вот у нас множество всех строк, или файлов - вопрос интерпретации, длинны N. Мощность такого множество соответственно 2^N. Теперь посмотрим на множество всех строк длин (N-1) и (N-2) и…(1). Мощность этого множество будет ∑2^N, где N от (N-1) до (1), и равно это 2^N-2. Сравниваем мощности множеств, первое больше на два элемента. Ну а теперь финт ушами - мы просто берем и выкидываем два элемента из первого множества, для удобства это строки состоящие только из 0 или 1. И опаньки, биекция, если не верите можете прям на бумажке нарисовать и сравнить. И что получили в итоге? Получили что любую, кроме двух, строк можно переписать в виде минимум на один бит короче. Убрали бы больше элементов, сократили бы еще сильнее, это просто самый простой вариант.

2)больше клеток: Возьмем множество всех строк длинны от N до 1. Зададим функцию F(n), и обратную ей G(n), которая берет на вход один элемент и выдает другой. Во общем то все. F(n) функция абсолютно арбитрарная, просто применяешь F(n) несколько раз, пока нужный результат не получишь и все. Другое дело что хотелось бы побыстрее, поэтому -

2.1)столько же клеток, но в другом порядке: Вот возьмем множество всех строк размера N и упорядочим его следующим образом. Для этого мы берем функцию X(n), делает она следующие - берет бинарную строку и возвращает натуральное число от 1 до 2^N. Как она должна его считать честно не знаю, но она должна делать что-то приблизительно следующие: строим бинарное дерево(?) сравнений, сначала сравниваем половинки строки друг с другом. потом четвертинки, и вот тут уже не знаю, нужно ли сравнивать каждую с каждой или хватит сравнений 1 к 2, и 3 к 4. потом осьмушки итд. в конце сравниваем соседние биты, вот тут каждый с каждым точно лишнее. Потом переводим эти сравнения в значения с весами, например строки в которых есть повторения половинок должны быть ниже чем те у которых повторяются четвертинки, а те у которых нет повторений ни четвертинок ни половинок должны стоять выше, ближе к началу, к числу 1. Потом делаем над этими значениями некие операции и ВЖУХ! получаем натуральное число, он же порядковый номер. К примеру если N=8, то строка 11111111 должна иметь номер 256, строка 00000000 номер 255, строка 11111110 номер 254 итд. Вот что это за ВЖУХ! и нужно выяснить. Сначала я думал что можно просто обойтись тем что можно представить строку как число сочетаний из количества единиц по N, и все сочетания, где количество единиц приближается к половине длинны, просто поставить спереди, но потом прикинул что например строка 00001111 при таком подходе будет стоять выше чем строка 00101001, а это фатальный недостаток. Ну вот, допустим выясняли как ВЖУХ! выглядит, нашли порядковый номер в упорядоченном по повторениям списке. А теперь просто подставляем вместо этой строки другую строку с тем же номером, но в списке упорядоченном просто лексикографически. Ну а дальше например отправляешь данную строку в метод 1).

Остается только реализовать это все в софте. А вот это я не умею. Может кто-нибудь напишет?


Ответ на: комментарий от q250

эти 512бит записываем в тело архиватора

Не 512 бит, а 512 * (2**512) бит. 512 бит это только одна запись в таблице. Всего в таблице будет порядка 2**512 элементов. При этом число атомов в наблюдаемой вселенной оценивается в примерно 2**270 (оценка сверху), то есть места во вселенной для хранения таблицы просто не хватит.

i-rinat ★★★★★
()

Во всём этом есть только 1 здравое зерно которое можно понять и использовать, оно и используется, а именно использовать индексы как коды, подстановки или смещения (все алгоритмы LZname) так работают.

Ты свой алгоритм можешь и без программ проверить, на бумажке так как мне кажется кроме тебя его просто никто не понял. А особенно магические F(x) которые скромно умалчиваются, мол там вся магия. Так в этом и суть придумать конкретную последовательность действий которая приведёт к удалению избыточный данных с сохранением порядка при добавлении наименьшего количества данных требующихся для восстановления упорядоченных данных в изначальную форму. Любой алгоритм сжатия просто меняет представление данных.

Зададим функцию F(n), и обратную ей G(n)

Магия Хогвардца? Где кишки этих волшебных функций? =)

Вот возьмем множество всех строк размера N

Не, давай возьмём множества всех значений байта это от 0 до 255 =) А затем все комбинации это 255^255 и это только для данных размером в 255 байт :D

Для этого мы берем функцию X(n), делает она следующие - берет бинарную строку и возвращает натуральное число от 1 до 2^N

Ок, можно в PI найти строку нужную и вернуть позицию числа после запятой с которой эта строка начинается =))))))))))))))) Тут проблема, опять волшебная функция которая. Если для бинарного представления строки будет ровно одно уникальное ей число, то это число и будет сама строка в битовом представлении. То есть эта функция просто вернёт входящую в ней строку всё. Дальше смысла думать уже нет, не есть ещё вариант, мы по строке делаем хеш, суём строку в хештаблю и выдаём индекс… Все всё поняли но я доскажу в «сжатых» нам придётся хранить сами исходные данные в полном размере + оверхед на хеши =)) Короче на этом этапе всё. Капут. Второй раз =)

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

Не ну на деле можно для некоторого ограниченного числа значений придумать ограниченные алгоритмы. Например если нам между сервером и клиентом надо гонять данные состоящие максимум из 15~16 значений, но в любых комбинациях и любой длинны, мы построив всего одну табличку подстановки размером в 15~16 байт и один раз передав её клиенту все последующие данные можем сжимать ровно в два раза, независимо от их длинны (ну зависимо, чётное или нет количество пересылаемых байт), просто на халяву уменьшив трафик в два раза и имея практически нулевую нагрузку на CPU для распаковки и упаковки. У меня где-то игрушечный архиватор валяется самописный (к слову надо доделать) на этом принципе, только недописанный и там есть проблемки…

Так и у тебя если где то что-то имеет смысл, то ИМХО либо только у тебя в голове (в смысле только ты это понимаешь) либо только для определённого случая и определённых данных или их размеров.

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

Хотя фиг знает, может ты просто настолько умно завернул мысль что как минимум лично я воспринимаю её как глупость, а на деле я сам дурак, а у тебя новаторская идея просто недосказанная. Всякое бывает. Но вот это эф от икс… На бумажке сожми данные и разожми, для алгоритма компьютер не нужен, достаточно карандаша и бумаги.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

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

DumLemming ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

накласть на «логику построения». вы из 2^N вычли два и получили 2^(N-1). было такое? вот и обьясните как это получилось, для произвольного N. потому что из этого вопиющего «волшебства» и получилось ваше «сжатие».

еще раз. N - длинна строки в битах. Вот у нас есть множество всех битовых строк длинны N. их у нас 2^N. понятно на этом моменте? Вот у нас есть множество всех битовых строк длинн (N-1) и (N-2) и…(1). сколько их у нас, сколько подобных строк существует, какова мощность подобного множества? считаем, получаем 2^N-2. теперь вычтем из мощности первого множества мощность второго, получаем 2. что это 2 означает? это означает что первое множество больше второго на 2, прописью два, элемента. а теперь финт ушами: мы просто берем и выкидываем из первого множества 2, две, любые строки, для нашего удобства удалим строки состоящие из одних нулей и единиц. теперь мощности этих множеств равны -> биекция -> профит. естественно нам где-то нужно будет хранить оригинальную длину строки, я предлагаю хранить длину в теле архиватора. то есть архиватор на вход будет принимать файлы СТРОГО определенного размера, ни битом больше ни меньше. понятно или нет?

Не 512 бит, а 512 * (2512) бит. 512 бит это только одна запись в таблице. Всего в таблице будет порядка 2512 элементов. При этом число атомов в наблюдаемой вселенной оценивается в примерно 2**270 (оценка сверху), то есть места во вселенной для хранения таблицы просто не хватит.

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

q250
() автор топика
Ответ на: комментарий от DumLemming

Про гигантский словарь, таскаемый с архиватором уже было? Один из вариантов я выше привёл

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

Вариант с маленьким словарём я выше тоже привёл. Сжать любые данные в 2 раза используя 15 байтовую табличку подстановки, но только если сжимаемые данные состоят лишь из этих 15 символов =)

сжатие таки вырастает дальше предела

Вся суть, все проблемы в сжимаемых данных это сохранение порядка уникальных значений, сами данные можно представлять как угодно, сжимать как у Хаффмана самый часто используемый «символ» до 1 бита буквально, использовать сдвиги и смещения для кодирования повторяющегося LZxxx всякие,кодировать длину повторяющихся значений RLE всё это смешивать на тех кусках данных где один алгоритм лучше работает, но работают они лучше или хуже потому что разные данные имеют разный порядок уникальных значений и самое главное что они в себе несут это не сами сжатые данные, а их порядок.

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

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

можно в PI найти

нельзя, аргументацию смотреть выше.

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

в том то и суть что методы универсальны, и работают на любых строках, или почти на любых.

достаточно карандаша и бумаги.

вот кстати, задание. берешь бумагу и начинаешь писать два столбика. в левом столбике все строки длинны N, только берите N небольшим, чтоб попроще, в правом столбике все строки длинны (N-1) и меньше, начиная со строки «0» и далее вниз, заканчивая самой большой строкой размера (N-1). заметили что нибудь?

Где кишки этих волшебных функций? =)

ок, пример так пример подобной трансформации, трансформация не самая оптимальная но уже что-то, самая оптимальная это там где «вжух». два столбика, в левом все строки упорядочены в лексографическом порядке, в правом порядок следующий. в начале ставятся строки у которых отношение количества единиц к длине строки равно 0,5. потом ставиться строки с количеством единиц меньше на одну, потом еще на одну, и в конце с нулем единиц. каждая строка под собой имеет строку которая является её зеркальным отражением, единицы меняем на нули. картиночка для понимания https://imgur.com/a/ANR8La9 чирикните если нужен конкретный пример для конкретного N.

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

q250
() автор топика
Ответ на: комментарий от q250

Равна 2^(N) сделав -1 в начале ты суммы всех остальных свёл к половине первого значения. А в чём суть то? Отними от байта 1 бит и получишь максимальное значение 127 добавь бит и ты добаишь ещё 128 новых значений =) Так что 2^(N-1) равно 2^(N)/2 =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от q250

Всё сложно, не для моего ума, я спать :D Завтра почитаю, кто и что ответят. Но в любом случае спасибо за тему, вспомнил что надо доделать и выложить свой (наверное велосипедный) механизм сжатия. Суть которого на всякий случай я выше пару раз написал, а то скажут, ааа жопа идею стырил =) На всякий случай ещё добавлю в нём ещё кодирование расстояний между уникальными значениями словаря и битовые маркеры существования значения в словаре для возможности поиска в предыдущих =) Зарядил меня так сказать :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от lovesan

Шутка (наброшу немного)

Небольшая прелюдия.

Веду разработку API для создания и работы с объектами в run-time на основании метаданных.
Объекты могут быть любой сложности и иерархии.
Например non problem создать метаданные для любой конфигурации 1С 8.3, Excel, ...
Объекты могут содержать любые базовые типы данных, а также: списки, деревья, таблицы, массивы, ...

Разработано много хорошего API, но вот считаю ли себя профи в этих вопросах?
НЕТ.
Может на пару процентов и разбираюсь в вопросах использования динамических объектов.

В обсуждаемых вопросах ничего не понимаю.

Немного наброшу (суббота сегодня).

https://ru.wikipedia.org/wiki/Электричество

«При движении заряженных тел (как макроскопических тел, так и
микроскопических заряженных частиц, переносящих электрический
ток в проводниках) возникает магнитное поле и ...»

Что это означает?
Если заряд «движется», то наверное откуда-то он уходит и его «там» уже нет?
Однако похоже он нигде не убывает.
Тогда, что означает термин «движется»?

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 2)
Ответ на: комментарий от Forum0888

Тогда, что означает термин «движется»?

На самом деле заряд никуда особо не движется, в том числе по проводам.

Туалетно-водопроводная аналогия, с помощью которой объясняют все это дело в школе, не имеет отношения к реальности вообще.

lovesan ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

чувак рассуждает так.

если есть битовая строка длиной N - то возможны 2^N вариантов этой строки. мощность множества - 2^N. назовем его множеством A.

однако суммарная мощность суммы множеств {1}, {2}… {N-1} битовых строк есть 2^N-2, (назовем его множество B).

значит мы можем отобразить множество A в множество B, если от A отнять два элемента. отнимем 2 элемента и назовем это множество - AA.

и вот тут содержится прокол, поскольку чтобы отобразить AA -> B, надо не только записать некое число из множества B, но и присовокупить к нему информацию - какому множеству из {1} {2}… это число принадлежит. если их перенумеровать, то получатся числа от 1 до N-1.

то есть строка из первого множества будет отображаться в пару «номер множества в множестве B + строка в этом множестве». и только тогда отображение будет однозначным.

например 5:12 - что гласит - число 12 в в виде битовой строки длиной 5 бит.

итак на каждое отображение надо не менее log основанию 2 от длины в битах данного подмножества в множестве B.

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от Forum0888

Что это означает?

Электромагнитное поле скорее «возмущается», ну или можно сказать вибрирует, или колышется, но движется - это глупость, конечно

lovesan ★★★
()
Ответ на: комментарий от alysnix

https://ru.wikipedia.org/wiki/Теоремы_Шеннона_для_источника_общего_вида

https://intuit.ru/studies/courses/2256/140/lecture/3910?ysclid=lpdrpyrlnq2010... Основы теории информации и криптографии

https://vikidalka.ru/1-180497.html?ysclid=lpdrsp3gwq502144826 Теоремы о возможности сжатия информации при кодировании.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 2)
Ответ на: комментарий от Forum0888

он фактически не сжимал, а просто перекодировал одни битовые последовательности в другие, но поскольку вот тот самый номер подмножества в множестве B, он как бы не стал рассматривать всерьез, у него и получилось…типа сжатие.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

итак на каждое отображение надо не менее log основанию 2 от длины в битах данного подмножества в множестве B.

хранить оригинальную длину действительно нужно. из это проблемы можно выйти просто сохраняя её в теле архиватора. то есть архиватор будет принимать на вход ТОЛЬКО файлы определенной длинны, ни битом больше ни меньше. я это уже писал кстати.

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

ты картинки видишь нет? четко же видно, в худшем случае сокращение на бит. убрали бы больше элементов, сократили бы еще сильнее.

q250
() автор топика
Ответ на: комментарий от q250

тебя не смущает, что ты отображаешь исходное множество на множество равной мощности и говоришь об упаковке? но упаковка это отображение на множество МЕНЬШЕЙ мощности, используя особенности исходной последовательности. если такого отображения на множество меньшей мощности не существует, то и упаковки не будет.

alysnix ★★★
()
Ответ на: комментарий от alysnix

На самом деле это взорвет мозги любому кто учился тому, что «ток движется по проводам», и прочим устаревшим выдумкам.

Ничего он там не обманывает, он просто рассказывает как на самом деле работает электромагнитное поле.

Я бы правда, на его месте, еще бы разбавил это для пущего взрыва мозга, всякими теориями, на тему что «фотон на самом деле существует в единственном числе, а вселенная его наблюдает в разных состояниях из-за искажения пространства-времени массой»

lovesan ★★★
()

сжатие это перестановка элементов множества входов в элементы множества выходов

входной элемент это пакуемая последовательность

сжатие(без потерь) это взаимооднозначное соответсвие более короткой последовательностью выхода более длиной последовательности входа

по факту сжатие работает на тех данных на которых оно сжимает ибо существуют входа на которых сжатие не сжимает ибо мощности равномощьны

qulinxao3 ★★
()
Ответ на: комментарий от q250

есть архиватор будет принимать на вход ТОЛЬКО файлы определенной длинны, ни битом больше ни меньше

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

anonymous
()
Ответ на: комментарий от alysnix

тебя не смущает, что ты отображаешь исходное множество на множество равной мощности и говоришь об упаковке? но упаковка это отображение на множество МЕНЬШЕЙ мощности, используя особенности исходной последовательности. если такого отображения на множество меньшей мощности не существует, то и упаковки не будет.

картинки просто посмотри говорю. рассмотрены случаи для строк длин 4, 5 и 8 бит, хотя очевидно что длина может быть любой.

q250
() автор топика
Ответ на: комментарий от q250

рассмотрены случаи для строк длин 4, 5 и 8 бит, хотя очевидно что длина может быть любой

очевидно

Математика так не работает даже в школьном курсе, попробуй ещё раз.

anonymous
()
Ответ на: комментарий от lovesan

то, что он там рассказывает, учат курсе на 2-3 физического вуза. ребята в видосе явно растолковывают распространение эм волн в пространстве. причем используя проги моделироваия, которые все это прекрасно показывают… которые и писали те, кто изучал это все на 2-3 курсе вуза.

alysnix ★★★
()
Ответ на: комментарий от anonymous

На следующей итерации предлагаю ввести ограничение на содержимое входных данных.

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

Математика так не работает даже в школьном курсе, попробуй ещё раз.

и ты тоже на картинки посмотри, тоже станет очевидно, что очевидно.

q250
() автор топика
Ответ на: комментарий от q250

сжатие это перенумерация

эффект локального неравновесия как в Сами боги Азимова

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

имя константы как генератор бесконечной последовательности - сжатия коэфициент бесконечность

ваш укур не укурест сорян

qulinxao3 ★★
()
Ответ на: комментарий от Forum0888

Если заряд «движется», то наверное откуда-то он уходит и его «там» уже нет?

да, если «там» он не восполняется. Только заряд с его носителями не путай, да? Это в плазме/электролите/вакууме механическое перемещение ионов/электронов через сечение эквивалентно току, в проводниках несколько бОльшее колдунство. Хотя и там носители постепенно дрейфуют.

arkhnchul ★★★
()
Ответ на: комментарий от lovesan

В 2024 разработаю API для создания и использования «хранилищ данных».

Ныне много такого рода программ, но они не универсальные.
API позволит создавать «Хранилище данных» любой сложности и иерархии.

Каким образом?

Пользователь используя метаданные создаёт требуемую ему модель хранения, а вопросы доступа, изменения, удаления, ... «возьмёт на себя» API.

Кстати хранилище можно будет использовать для хранения ресурсов (например ресурсов некой программы).

Но вопрос N1 - разработка GUI.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от arkhnchul

Нет - SDL + OpenGL.

SDL уже давно перевёл на C++ (название оставил прежним).
То SDL, которое развиваю, использует метаданные и базы метаданных.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 2)
Ответ на: комментарий от lovesan

Оно движется в направлении, противоположном направлению наибольшого градиента электрического поля. В случае с проводами электроны движутся вдоль провода. В случае с вакуумной лампой электроны летят от катода к аноду. Причем летят, довольно быстро, в отличии от электронов в проводе

hateWin ★☆
()
Последнее исправление: hateWin (всего исправлений: 1)
Ответ на: комментарий от lovesan

На самом деле заряд никуда особо не движется, в том числе по проводам

Заряд движется. И движется вдоль градиента электрического поля. Другое дело, что электроны движутся медленно, но к скорости распространения сигнала по проводам это не имеет никакого отношения

hateWin ★☆
()
Ответ на: комментарий от arkhnchul

это случайно не переизобретение sql+orm/монги/чеготамеще?

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

Другими словами это сувание и классов и созданных по ним объектов в свою базу данных. Зачем? Ну хочет человек.

Obezyan
()
Ответ на: комментарий от Obezyan

сущность со своей логикой

сувание и классов и созданных по ним объектов в свою базу данных

вот, собственно, и непонятно, что же имеется в виду под пространными словесами о метаданных и «сложности».

arkhnchul ★★★
()
Ответ на: комментарий от Forum0888

Вы создаёте метаданные объекта, который в частности может быть и СУБД.

Так понятно?

Конечно понятно. Я называю это контузией от 1С.

Метаданные это данные о… данных. Состав, структура, поля, типы этих полей, ссылки, ссылки на ссылки, геттеры, сеттеры и прочие. Т.е. то что называется классы и интерфейсы в ООП. Ваш подход в том чтобы не писать их сразу, а дать инструмент, на котором можно создать описание этих классов и интерфейсов и хранить их.

Просто доп слой абстракции (и изоляции) сверху.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 2)