Как включить в модель класс классов

Поговорим подробнее о том, когда применять отношение класс-подкласс (отношение специализации), а когда – отношение класс-член класса (отношение классификации).

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

Возьмём корову Зорьку, конкретный физический объект. Рассмотрим категорию Корова, уровнем выше, чем корова Зорька. Допустим, ещё уровнем выше нас интересует категория Животное. И пусть для каких-то надобностей нам нужна категория Вид животных, в которую мы бы хотели включить категории Корова, Лошадь, Волк и т.д.

Посмотрим на то, как мы говорим:

Зорька – это Корова

Корова – это Животное

Корова – это Вид животных

Лошадь – это вид животных.

Выглядит всё одинаково. Какое же онтологическое отношение (или разные отношения) скрываются за словом «это»?

С фразой «Зорька – это Корова» мы уже разобрались. Зорька – индивид, Корова – класс, значит отношение может быть только классификацией. Как разбираться дальше?

Давайте попробуем сказать через уровень:

Зорька – это Животное

Зорька – это Вид животных

Вот мы и увидели разницу, второе высказывание – бессмысленно.

Во фразе «Корова – это Животное» - у нас отношение специализации. Всякая корова – животное, поэтому и Зорька – животное.

А вот во фразе «Корова – это Вид животных» - отношение классификации. Вид животных –это класс классов, его члены – классы Корова, Лошадь, Волк. Поэтому Зорька – член класса Корова, но не член класса Вид животных, что и проявилось в бессмысленной фразе.

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

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

6 лайков

Пишу свои размышления:

бензопила - класс
конкретная бензопила дружба №184332 - экземпляр класса бензопила
бензопила это подкласс класса инструмент

при этом бензопила не является подклассом предмет торговой номенклатуры
конкретная бензопила дружба №184332 является экземпляром класса предмет торговой номенклатуры

Добавляем сразу индивид - Бензопила “Дружба”, которая лежит у меня в гараже.
Этот индивид является членом класса Бензопила.

Дальше Бензопила (класс) это Инструмент. Бензопила подкласс класса Инструмент.
Но моя Бензопила “Дружба” из гаража это член класса Инструмент.

Предмет торговой номенклатуры это класс классов. Инструмент член класса классов Предмет торговой номенклатуры. Там могут быть ещё какие-то классы в зависимости от того, чем мы торгуем. Наверно что-то а-ля Строительные материалы могут быть членом класса классов Предмет торговой номенклатуры.
Бензопила “Дружба” из гаража с классом классов напрямую никаких отношений не имеет.
Класс снизу иерархии Бензопила является экземпляром класса Предмет торговой номенклатуры.

Да, все верно.

1 лайк

Всё верно кроме последнего рассуждения. Предмет торговой номенклатуры - это класс классов, содержащий классы того, чем мы торгуем (бензопилы, шуруповёрты,…), а не конкретные экземпляры бензопил и шуруповертов.

1 лайк

Да, все так. Я почему-то думал, что номенклатура содержит конкретные экземпляры

Второе предложение повторяет первое другими словами, а не дополняет начатый перечень вариантов, верно? Тогда “и” в его начале надо заменить на “то есть”, а то получается недоумение…

Нет, вы не поняли. Это именно две принципиально разные ситуации. Во втором случае ничего не известно о том, если ли среди членов первого класса члены второго класса. А вот сам второй класс - является членом первого.

Добавил индивида и отразил отношения между заданными категориями на диаграмме:

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

Концепт, обозначаемый фразой “Предмет торговой номенклатуры”, на мой взгляд, характеризуется неплотным концептуальным пространством - кто-то посчитает, что раз предмет - значит и товарная позиция (SKU) подойдет, кто-то включит в этот класс конкретные экземпляры товаров, кто-то - только номенклатурные группы, а кто-то еще упихает туда и многоуровневый товарный классификатор.

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

Также названия классов сделал во множественном числе (подстраиваюсь под способы референции предполагаемого адресата))

Модифицированная диаграмма:

1 лайк

Возможно, кому-нибудь пригодятся мои наброски, сделанные в процессе “разбирательства” в различении отношений “класс-подкласс” и “класс-член класса”:

Пусть у нас определены несколько множеств:

A = {a, b, c}

B = {d, e}

C = A ∪ B= {a, b, c, d, e} ← множество, содержащее 5 элементов

D = {A, C} = {{a, b, c}, {d, e}} ← множество множеств, содержащее 2 элемента:

  1. первый элемент - множество A (которое, в свою очередь, содержит 3 элемента)
  2. второй элемент - множество В (которое содержит 2 элемента)

Для программистов и сочувствующих: отличие C от D аналогично отличию массива от массива массивов

Мне отношение подкласс-класс оказалось проще понять по аналогии с отношением подмножество-множество:

A является подклассом С, если все члены класса A содержатся в качестве членов в классе С

Для приведенных выше примеров множеств:

  • A является подклассом С.

  • A не является подклассом D (члены класса А не является членами класса D).

  • но A является членом класса D - отношение классификации (класс-член класса)

  • а еще D является классом классов, т.к. все его члены - классы.

@viktor-agroskin Виктор, буду признателен, если у Вас найдется время прокомментировать правильность изложенного

2 лайка

Да, всё так!

1 лайк

Спасибо!

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

Можно было б написать так:

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

Формулировка «Плотность концептуального пространства» очень понравилась, встретил впервые. Погуглю корни и специфику и буду применять. Обещает быть метафорой с очень хорошей объяснительной силой, и возможно даже вычисляемой метрикой в NLP. Кажется, Word2Vec по сути опирается на что-то подобное.

Погуглите в aisystant. Понятие о плотности концептуального пространства вводится в курсе “Моделирование и собранность”.

2 лайка

@viktor-agroskin спасибо большое за отдельный пост =)

В чате МиС-2024.1-И вы писали:

<… >А вот к классам классов - программирование не готовит. <…>

Мне тогда стало очень интересно, в чем проблема, я решил запрограммировать ваш пример на TypeScript, и, кажется, понял, в чем проблема:

class Animal {
    // ...
}

// Отношение специализации
class Cow extends Animal {
    // ...
};

// Отношение специализации
class Horse extends Animal {
    // ...
};

// Отношение классификации
const Zorka = new Cow();

// Проверка классификации (Зорька – это Корова)
console.log(Zorka instanceof Cow); // true/верно

// Другой способ проверки того же самого
const ClassOfZorka = Zorka.constructor;
console.log(ClassOfZorka === Cow); // true/верно

// Проверка классификации (Зорька – это Животное)
console.log(Zorka instanceof Animal); // true/верно

// Проверка специализации (Корова - это Животное)
console.log(Cow.prototype instanceof Animal); // true/верно

// Вид животных - это просто строка: "Корова", "Лошадь". Это вид одного животного, например, для Зорьки - Корова.
type AnimalType = Cow | Horse;

// Виды животных - это набор видов животных =)
const AnimalTypes: AnimalType[] = [Cow, Horse];

// Покажем тип класса "Виды животных"
console.log(AnimalTypes.constructor.name); // Это Array/массив/список

// Тип Зорьки (Корова) - входит в виды животных
console.log(AnimalTypes.includes(ClassOfZorka)); // true/верно

// Корова - это НЕ вид животных
console.log(AnimalTypes.includes(Zorka)); // false/ложно

Вся соль кроется именно здесь:

type AnimalType = Cow | Horse;
const AnimalTypes: AnimalType[] = [Cow, Horse];

Способов сделать отношение специализации или классификации ровно по одному (class Cow extends Animal и const Zorka = new Cow(), тут все предельно понятно.

В вот оформить отношение классификации для класса и класса классов есть несколько вариантов. Например, как массив строк (а не видов животных):

type AnimalType = string;
const AnimalTypes: AnimalType[] = [Cow.name, Horse.name];

Также вместо массива можно:

  • использовать набор уникальных значений (Set) или перечисление (Enum)
  • пользоваться напрямую type AnimalType = Cow | Horse;, но тогда не получится сделать проверки, для этого нужно создавать отдельную структуру данных
  • сделать вообще отдельный класс “Типы животных” со своим поведением и одним из вариантов выше “под капотом”

Я правильно понял, что вы указывали на сложности описания класса классов на языках программирования, которые я изложил выше?

меня кстати довольно давно уже смущает подобный синтаксис. Почему extends если по факту идет сужение множества?

Поэтому мы и говорим, что класс в ООП - это близкородственная концепция, но не совсем та. Extends он потому, что расширяет набор атрибутов/методов/критериев. То есть класс как множество - конечно сужает, но у них не было в голове идеи класса как множества, просто так совпало )

1 лайк

Было бы почище, если бы Animal было определено, как поведение (behaviour), а Cow бы его воплощало (Cow implements Animal)?

Да, мне implements нравится больше. Но implements хорошо сочетается с интерфейсами и их иерархиями, а не с классами.