我想知道编写代码的最佳方法。
情景1:
function main() {
var arr = [];
performSomeLogic(arr);
}
function performSomeLogic(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some more logic
}
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some other logic
}
}
方案2:
function main() {
var arr = [];
performSomeLogic(arr);
}
function performSomeLogic(arr) {
var sum = 0;
sum = commonLoop(true, arr);
sum = commonLoop(false, arr);
}
function commonLoop(flag, arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
if(flag){
// some more logic
} else {
// some other logic
}
}
return sum;
}
正如您在第一个场景中看到的,我们只有2个函数(main和performSomeLogic),在第二个场景中,我们有3个函数,代码已经模块化(main,performSomeLogic和commonLoop)。
哪种编码方式更好?
答案 0 :(得分:2)
我认为方法应尽可能做一件事。保留您的方法,以便您可以为各个步骤传达更好的意义。 我觉得这会使你的主要方法更清晰,更易读,但不可否认它可能更冗长。
function main() {
var arr = [];
var sum;
sum += performFirstLogic(arr);
sum += performSecondLogic(arr);
}
function performFirstLogic(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some more logic
}
return sum;
}
function performSecondLogic(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some more logic
}
return sum;
}
根据具体情况,我可能会有机会传递函数以使事情变得更容易。
function main() {
var arr = [];
var sum;
sum += processLoop(arr, firstLogic);
sum += processLoop(arr, secondLogic);
}
function processLoop(arr, customLogic) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
customLogic(arr[i]);
}
return sum;
}
function firstLogic(data) {
//First lot of logic
}
function secondLogic(data) {
//First lot of logic
}
你的milage可能会有所不同。
答案 1 :(得分:0)
简答:取决于
长答案:
代码是做什么的?循环中出现的逻辑是否紧密相关?完全是一项单独的任务吗?
考虑以下版本:
场景1(已更改)
function main() {
var arr = [];
performSomeLogic(arr);
}
function performSomeLogic(distinctData, uniqueData) {
var sum = 0;
sum += clearlyPerformDistinctTask(distinctData);
sum += clearlyPerformUniqueTask(uniqueData);
}
function clearlyPerformDistinctTask(arr) {
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some more logic
}
return sum;
}
function clearlyPerformUniqueTask(arr) {
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
// some more logic
}
return sum;
}
关于可读性的全部内容!将较小的任务分解为完全正确且仅执行其操作的功能。最好将不同的逻辑移到自己整洁的小盒子里,不要弄乱你的代码!一切都不可能是一个巨大的程序!
如果两个循环执行完全不同的任务,请不要将它们放在一起,如果不清楚且相关的逻辑,请在参数之间切换!
但是,如果逻辑紧密相关:
场景2(已更改)
function main() {
var arr = [];
performSomeLogic(arr);
}
function performSomeLogic(data) {
var sum = 0;
sum += clearlyPerformTaskWithOptions(data, { sumType: "X"});
sum += clearlyPerformTaskWithOptions(data, { sumType: "Y"});
}
function clearlyPerformTask(arr, options) {
for (var i = 0; i < arr.length; i++) {
if (options.sumType == "X")
sum += arr[i];
else if (options.sumType == "Y")
sum += 2 * arr[i];
else
sum -= 4;
// some more logic
}
return sum;
}
将逻辑分组在一起是否有意义?数据集是否使用相同?它是通过不同方式实现同样的作用吗?你读它时有意义吗?
这些是您在组织代码时必须考虑的所有问题。
答案 2 :(得分:0)
你的问题有点混乱,因为不清楚你要做什么以及为什么,但你可能会在reduce method on arrays找到一些用处:
function main() {
var arr = [];
var sum = arr.reduce(sumAndDoLogic, 0);
// do stuff with sum
}
function sumAndDoLogic(sum, currentValue) {
if (/* something about currentValue */) {
// do some logic
} else {
// do some different logic
}
return sum + currentValue;
}