На абстрактных примерах без дизайна — тут только гадать, но в реальном проекте балансом между здравым смыслом и реиспользованием будет 1 вариант:
<div class="card">
<div class="card__header">
<h2 class="card__header-title">Заголовок</h2>
</div>
<div class="card__footer">
<h2 class="card__footer-title">Заголовок</h2>
</div>
</div>
Т. к. он избавляет от необходимости использовать каскад и эффективно использует нейминг для обозначения каждой сущности. Также я убрал префикс
c-
, т. к. не вижу в нём никакого смысла.
Вариант с
c-card-header
и
c-card-footer
смысла особого не имеет, т. к. создаёт ложное впечатление, что эти блоки могут использовться за пределами блока
c-card
.
Альтернативным правильным решением может быть использованием модификаторов элемента
card__header
для описания их рзличий в зависимости от расположения:
<div class="card">
<div class="card__header">
<h2 class="card__title card__title_position_header">Заголовок</h2>
</div>
<div class="card__footer">
<h2 class="card__title card__title_position_footer">Заголовок</h2>
</div>
</div>
Стили в
card__title
в этом случае сгруппируют общие свойства, а в модификаторах опишутся различия.