Skip to content

Instantly share code, notes, and snippets.

@iegik
Last active April 1, 2025 07:32
Show Gist options
  • Save iegik/4ba69b7cfbd952a67846a3b7ab243c32 to your computer and use it in GitHub Desktop.
Save iegik/4ba69b7cfbd952a67846a3b7ab243c32 to your computer and use it in GitHub Desktop.

FTA Score: 47 (Lower is better)

OK - Considered Maintainable

Item Result

  • Num. lines 44
  • Cyclomatic Complexity 5

Halstead

  • Unique / Total Operators 16 (60)
  • Unique / Total Operands 24 (58)
  • Length 40
  • Vocab Size 118
  • Volume 275.31
  • Difficulty 12.41
  • Effort 3417.59
  • Time 189.87
  • Bugs 0.09

Lower scores for individual files are achieved by:

  • Keeping the number of logical paths to a minimum
  • Reducing the number of entities or operations in the code
  • Avoiding single files that contain 1000s of lines

https://ftaproject.dev/playground

export function (props) {
const {
className,
isActive,
value,
data,
renderItem
} = {
'className': '',
'isActive': false,
'value': 0.0,
'data': {},
'renderItem': (props) => { const { item } = props; return item['title'] ?? item['value']; },
...props
};
if (!isActive) return;
newClass = ' ' + " " + className;
items = '';
for (let item in data) {
if (!item['show'] && renderItem) {
// ...spread the rest props (kind of)
item = {
...props,
'class': false,
'isActive': false,
'value' : false,
'data' : false,
'renderItem': false,
'selected': item['value'] === value,
...item
};
items += (
"<option value=\"" + item['value'] + "\" selected=\"" + item['selected'] + "\">" +
renderItem({item}) +
"</option>"
);
}
}
return (
"<select class='" + newClass + "'>" +
items +
"</select>"
);
};
<?php
return function ($props) {
[
// Spread
'class' => $class,
'isActive' => $isActive,
'value' => $value,
'data' => $data,
'renderItem' => $renderItem
] = $props + [
// Defaults
'class' => '',
'isActive' => false,
'value' => 0.0,
'data' => [],
'renderItem' => function($props) { ['item' => $item ] = $props; return $item['title'] ?? $item['value']; },
];
if (!$isActive) return;
$newClass = ' ' . " $class";
$items = '';
foreach ($data as $item) {
if (!empty($item['show']) && $renderItem) {
// ...spread the rest props (kind of)
$item += array_merge($props, [
'class' => false,
'isActive' => false,
'value' => false,
'data' => false,
'renderItem' => false,
'selected' => $item['value'] === $value,
]);
$items .= (
"<option value=\"" . $item['value'] . "\" selected=\"" . $item['selected'] . "\">" .
call_user_func($renderItem, ['item' => $item]) .
"</option>"
);
}
}
return (
"<select class='$newClass'>" .
$items .
"</select>"
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment