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)

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

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

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

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

меняем на:

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

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

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

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

там к сожалению по другому никак…

Ок, спасибо!

AntonI ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от annulen

Хорошо, спасибо, постараюсь исправится

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

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

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

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

pon4ik ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.