#java #c_sharp #cpp #алгоритм
Допустим есть класс Item - предмет И у этого класса есть переменная, которая хранит в себе значение - тип предмета Это может быть стол, или ключ или что-то еще И вот возникает потребность узнать что за предмет перед нами? Всем сразу понятно, нужно написать геттер Но вот мне не понятно: лучше хранить в переменной целочисленного типа или же строкового? Например(Java): private final int ID; /* куча кода */ ID = 255; Или же private final String TYPE; /* еще одна куча кода*/ TYPE = "Stone"; P.S.: пример кода написан на Java, но он относится не только к этому языку
Ответы
Ответ 1
Не храните тип(класс) объекта в объекте если вы имеете дело с языком с сильной типизацией. Как правило, это ошибка проектирования. Вы можете легко нагуглить русский перевод книги "Скользкие места C++", где подробно описано, почему так делать нельзя - за исключением очень редких случаев - вкратце: накладные расходы, лишний код, ручные проверки, гора ошибок. Для других языков, думаю, подобные статьи/учебники тоже легко найти. Поймите, что тип объекта и его значение - это две абсолютно разные концепции. Полиморфизм придуман как раз для того, чтобы программист не выбирал, например "а какую функцию вызвать, если объект должен двигаться?" Камень - не двигается Птица - летит Курица - (якобы не птица), ходит. но если испугана, подпрыгивает и немножко летит, и почти всегда летит, если прыгает с высоты. Кот - ходит Машина - едет Мина с детектором движения - взрывается в языке с сильной типизацией и поддержкой полиморфизма вы просто вызываете метод move и объект сам выполняет свой метод move, а если у него нет такого метода, вы (можете) получить ошибку при компиляции. Без лишних проверок, без лишних ошибок P.S. кроме того, в C++ и Java есть свои способы узнать тип объекта: для C++ - RTTI в рантайме или SFINAE на этапе компиляции для Java - someObject.getClass() для Java, я так полагаю, вызов getClass может нести дополнительные накладные расходы в рантайме, если вы начнете еще и хранить тип отдельным значением, расходы (память/цпу) еще больше возрастут для C++ использование RTTI всегда несет дополнительные расходы (и еще кучку проблем), и применяется достаточно редко P.P.S. если говорить про метапрограммирование, то в C++ с использованием шаблонов/библиотеки в духе boost:hana понятия типа/значения могут слегка размываться, но это совсем другая тема для беседы P.P.P.S. если вам неймется и/или очень надо (например, в случае, когда ваши материалы это не какие-то классы, а просто номера текстур), то их надо хранить в константах, доступных языку (для c++ это define/enum/enum class), а не в строковых значениях. Константы будут обработаны на этапе компиляции, займут в памяти меньше места, и кроме того, вы получите поддержку автодополнения вашей IDE (поскольку она увидит, что константа MATERIAL_TYPE_CONCRETE (ака бетон, допустим) присутствует в коде), а строчки будут болтаться туда-сюда со всеми их конструкторами и накладными расходами и без всякой поддержки со стороны IDE P.P.P.P.S конкретно к вопросу не относится, но может вам помочь: если вы делаете игру или нечто похожее, что требует много разнообразных ресурсов, текстур, моделей объектов и т.д., я бы на вашем месте сделал следующее: запихиваете все ресурсы в бд (mysql/postgres/sqlite - по ситуации смотрите) допустим в виде записи (айди, имя, тип ресурса, хэш объекта может быть) делаете простой веб-редактор или командный скрипт для добавления ресурса в бд. пишете простой скриптик, который генерирует вам заголовочный файл C++ или Java-класс из этой базы данных это потребует день-два работы, зато профит вы начнете ощущать каждый раз, когда вам не придется руками добавлять файл в код, размещать его в нужном каталоге и т.д. если для дебаг-режима вы добавите еще и запись в бд по частоте использованя ресурса,сможете например, легким запросом получить статистику, какие ресурсы у вас не используются, или для каких ресурсов слишком мало текстур и т.д.
Комментариев нет:
Отправить комментарий