до сих пор не получил никакой документации, которая связана с
я есть функцияUser::func()
(обратный вызов), который будет вызван классом шаблона (Library<T>
).
На первой итерации разработки все знают, чтоfunc()
служит только для этой единственной цели.
Через несколько месяцев большинство участников забывают, чтоfunc()
для.
После некоторого тяжелого рефакторинга,func()
иногда удаляется некоторыми кодировщиками.
Сначала я вообще не думал, что это проблема.
Однако после того, как я снова столкнулся с этимшаблон несколько раз, я думаю, что мне нужна контрмера.
Как оформить это элегантно? (мило && кратко && без дополнительной платы процессора)
примерВот упрощенный код:
(Реальная проблема заключается в разброске более 10 библиотечных файлов и более 20 пользовательских файлов и более 40 функций.)
Library.h
template<class T> class Library{
public: T* node=nullptr;
public: void utility(){
node->func(); //#1
}
};
user.h
class User{
public: void func(){/** some code*/} //#1
//... a lot of other functions ...
// some of them are also callback of other libraries
};
main.cpp
int main(){
Library<User> li; .... ; li.utility();
}
Мои плохие решения1. Комментарий / документВ качестве первого обходного пути я, как правило, добавляю такой комментарий:
class User{
/** This function is for "Library" callback */
public: void func(){/** some code*/}
};
Но он быстро испачкается - я должен добавить его к каждому «функционалу» в каждом классе.
2. Переименуйте "func ()"В реальном случае я склоняюсь к префиксу имени функции так:
class User{
public: void LIBRARY_func(){/** some code*/}
};
Это очень заметно, но имя функции теперь очень длинное.
(особенно когдаLibrary
-класс имеет более длинное имя класса)
Я рассматриваю возможность создания абстрактного класса в качестве интерфейса для обратного вызова.
class LibraryCallback{
public: virtual void func()=0;
};
class User : public LibraryCallback{
public: virtual void func(){/** some code*/}
};
Это дает ощущение, чтоfunc()
длячто-то-очень-внешнее. :)
Однако я должен пожертвовать стоимостью виртуальных звонков (v-таблица).
В критических случаях я не могу себе этого позволить.
(идея от Даниэля Жура в комментарии, спасибо!)
Почти 1 месяц спустя, вот как я использую: -
Library.h
template<class T> class Library{
public: T* node=nullptr;
public: void utility(){
T::func(node); //#1
}
};
user.h
class User{
public: static void func(Callback*){/** some code*/}
};
main.cpp
int main(){
Library<User> li;
}
Это, вероятно, чище, но все еще не хватает самодокументирования.