Вы сравниваете функции на разных уровнях абстракции.
Вы можете реализовать CalculateAverage(begin, end)
либо как:
template<typename Iter>
double CalculateAverage(Iter begin, Iter end)
{
return std::accumulate(begin, end, 0.0, std::plus<double>) / std::distance(begin, end)
}
, либо вы можете сделать это с помощью цикла for
template<typename Iter>
double CalculateAverage(Iter begin, Iter end)
{
double sum = 0;
int count = 0;
for(; begin != end; ++begin) {
sum += *begin;
++count;
}
return sum / count;
}
Первое требует, чтобы вы знали больше вещей, но как только вы их знаете, это проще и оставляет меньше возможностей для ошибки.
Он также использует только два генерических компонента (std::accumulate
и std::plus
), что часто бывает и в более сложном случае. У вас часто может быть простой универсальный функтор (или функция, простая старая функция может действовать как функтор) и просто сочетать его с любым алгоритмом, который вам нужен.
clickTrack
подключает прослушиватель событий click
и возвращает объект data
, который будет обновляться всякий раз, когда происходит событие щелчка, поэтому вы должны вызывать clickTrack
только один раз.
Прямо сейчас вы вызываете его снова после вашего события щелчка, поэтому он создает дополнительный прослушиватель click
и возвращает новый пустой объект data
.
Вы также захотите использовать e.target.text
для текста и получить имена классов, вызвав split(' ')
на e.target.className
:
function clickTrack() {
const data = {};
document.addEventListener('click', function clicked(e) {
if (e.target.matches('a')) {
e.preventDefault();
data['click.Classes'] = e.target.className.split(' ');
data['click.ID'] = e.target.id;
data['click.Destination'] = e.target.href;
data['click.ElementText'] = e.target.text;
}
}, false);
return data;
}
describe('Click Tracking', () => {
test('Clicking on an a tag will collect its information', () => {
const data = clickTrack();
document.body.innerHTML = '<a class="j1 j2 j3" id="j" href="http://www.google.com/">Jest</a>';
document.getElementById('j').click();
expect(data).toEqual({
'click.Classes': ['j1', 'j2', 'j3'],
'click.Destination': 'http://www.google.com/',
'click.ElementText': 'Jest',
'click.ID': 'j'
}); // Success!
});
});