LINUX.ORG.RU

разбивка толстого шаблонного класса на несколько хидеров?

 ,


1

2

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

Как бы это Ъ растащить по нескольким хидерам? Через #include?

@pon4ik, @hobbit.


Через include или перепроектирование. По такому описанию сказать что-то ещё нереально.

Но в общем и целом 800 строк, это лайтово вполне себе. Я вот не горжусь этим, но видал проект где функции были по 1200 строк :)

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

То бишь я какие то части/фрагменты/функции выношу в отдельные хидеры и инклюжу их внутрь класса? ОК, я просто так не делал никогда - чего по этому поводу говорят стиль и науки о написании кода?

Перепроектирование… оно в общем все как то и так собрано единственно возможным способом КМК, по наитию;-)

Для меня 800 строк это много. Хотя у нас часто встречаются толстые функции на несколько экранов.

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

Но в общем и целом 800 строк, это лайтово вполне себе. Я вот не горжусь этим, но видал проект где функции были по 1200 строк :)

Посмотри биткоин, функция на 1200 строк покажется тебе лайтовой. (А ещё можешь зачекаутить первый комит, там вообще пушка!)

filosofia ()

есть толстый шаблонный класс

занимает 800 строк

Разбивать на части ещё нет надобности, 800 строк это довольно мало. Разделение на части не сделает код более читаемым. Оно сделает чтение труднее.

i-rinat ★★★★★ ()
Ответ на: комментарий от AntonI

То бишь я какие то части/фрагменты/функции выношу в отдельные хидеры и инклюжу их внутрь класса? ОК, я просто так не делал никогда - чего по этому поводу говорят стиль и науки о написании кода?

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

filosofia ()

Разницы между шаблонным классом и просто классом нет никакой. Если ты пишешь приложение, а не либу, то реализацию шаблонов можно вообще в cpp файл засунуть, и тогда вообще не отличить будет.

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

Вообще то нет, раньше шаблонные методы размещались в хидерах что бы было возможно инстанцирование. Я не знаю как в последних компиляторах и стандартах, вроде пытались это как то решить…

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

Если ты пишешь приложение, а не либу, то реализацию шаблонов можно вообще в cpp файл засунуть, и тогда вообще не отличить будет.

Только если инстанцируешь шаблон в этом cpp всеми типами, которые использует программа.

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

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

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

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

Время компиляции здесь не критично.

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

инклюжу их внутрь класса

Не надо так. Выглядеть будет всрато. Лучше раскидай части по пространствам имён. Директивы include вне класса, в самом верху. Как обычно короче.

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

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

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

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

А как, интересно, ещё ты собираешься работать с хидерами? Без #include?

Miguel ★★★★★ ()

Таки да, 800 строк не самый клинический случай. Другое дело, что я шаблонными классами, тем более, БОЛЬШИМИ шаблонными классами вообще стараюсь не увлекаться. Поэтому я не уверен в своей компетенции в этом вопросе.

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

Мнэ… я имел ввиду следующее. Есть вот такое:

class A{
...
   class B{
      // многа букв
   };
...
};

меняем на:

// B.hpp
   class B{
      // многа букв
   };

class A{
...
#include "B.hpp"
...
};

ну и обмазать препроцессором что бы его можно было проинклюдить только в это место

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

Плохо так делать. У тебя B может несколько раз так объявиться + усложнится навигация.

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

Что бы он несколько раз так не объявился есть #ifdef - можно сделать так что бы он мог объявится только внутри A.

С навигацией становится проще (мне) - в емаксе дешевле в другой буфер прыгнуть чем листать вниз 300 строк.

AntonI ()

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

А так ранее сказали, что лучше не надо. 800 строк – реально небольшой класс.

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

Всё равно это такое себе. Обычно заголовок – законченный интерфейс модуля, и не стоит вставлять директиву включения посреди файла и/или объявления.

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

Я не следил за сменой стандартов, можно сделать параметризованный namespace? Потому что B активно юзает параметры A. Хотя можно че то с наследованием намутить…

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

AntonI ()

хидерам

Хедерам. Откуда там взяться И?

ˈhedər
OSBuster ()
Ответ на: комментарий от AntonI

Вроде нет. Смотри на cppreference. Там довольно актуальная инфа.

kachsheev ★★★ ()

Сабж. Вот есть толстый шаблонный класс,…

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

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

У прынцыпе можно, но нужно ли? Ну, будет класс B объявлен вне A.

Если очень хочется A::B, ну, затайпдефь его туда.

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

Йепрст! Так, щас я осознаю во что это выльется… спасибо;-)

AntonI ()

Мне вот интересно, откуда вы берете слово «хидер»? В какой сельской школе вас учат такому произношению?

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

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

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

Я бы даже понял «хеадер», это хотя бы честный транслит

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

Хотя судя по Гуглу хидер тоже является устоявшимся вариантом.

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

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

оно в общем все как то и так собрано единственно возможным способом КМК, по наитию

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

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

Чето возникает подозрение, что тебе нужны template template params.

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

Не, у меня пока такого ощущения нет. Я бы оставил это одним куском если бы не много строк.

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

Ну пока код не увидишь, сложно сказать. Если хочешь, скинь его мне, подумаем.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от AntonI

Хотя судя по Гуглу хидер тоже является устоявшимся вариантом.

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

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

Таких примеров наверное больше одного, но я не филолог.

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

Мне вот интересно, откуда вы берете слово «хидер»? В какой сельской школе вас учат такому произношению?

всяко лучше чем, хидор.

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

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

AntonI ()

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

core.hpp:

template<typename T>
class core 
{ void hello (); };

core_impl.hpp:

#include "core.hpp"
template<typename T>
core<T>::hello() { ... }
file.cpp:

#include "core_impl.hpp"

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

Да, я в итоге так и сделал. Почему то сходу до этого не допер… только чутка наоборот

core.hpp:
class A{...};

#include "core_/impl1.hpp"
#include "core_/impl2.hpp"
#include "core_/impl3.hpp"
file.cpp:
#include "core.hpp"

Вроде стало гораздо удобнее, до конца еще не осознал.

AntonI ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей