Skip to content

Instantly share code, notes, and snippets.

@crongro
Last active April 25, 2023 12:51
Show Gist options
  • Save crongro/355438f8f47dd646825e19e4cedee701 to your computer and use it in GitHub Desktop.
Save crongro/355438f8f47dd646825e19e4cedee701 to your computer and use it in GitHub Desktop.
test code source
export const printExecutionSequence = function() {
console.log(executionSequence.printAsStr());
return executionSequence.printAsStr();
}
export const executionSequence = (function() {
const sequence = [];
return {
update(str) {sequence.push(str);},
printAsStr() {
const len = sequence.length;
let resultStr = `κ³„μ‚°μˆ˜ν–‰μˆœμ„œ : ${sequence[0]}`;
if (len === 1) {return resultStr}
for(let i = 1; i < len; i++) {
resultStr += `, ${sequence[i]}`;
}
return resultStr
}
}
})();
/*
넓이λ₯Ό κ³„μ‚°ν•˜κ³ , κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ†Œλ“œ(μ‹€ν–‰μˆœμ„œλ₯Ό 별도 Object에 μ €μž₯)
*/
export const computeArea = {
circle(radius) {
return Math.PI * Math.pow(radius, 2);
},
rect(width, height) {
return width * height;
},
trapezoid(top, bottom, height) {
return 1/2 * (top + bottom) * height;
},
cylinder(radius, height) {
const circleSize = Math.PI * Math.pow(radius, 2);
const circumference = 2 * Math.PI * radius
return (circumference * height) + (2 * circleSize);
}
};
export const printArea = {
//Return value through console.log
//Log function call history on executionSequence object
circle(circleRadius, circleArea) {
executionSequence.update('circle');
console.log(`μž…λ ₯ν•˜μ‹  λ°˜μ§€λ¦„ ${circleRadius}의 원 λ„“μ΄λŠ” ${circleArea}μž…λ‹ˆλ‹€.`);
},
rect(rectWidth, rectHeight, rectArea) {
executionSequence.update('rect');
console.log(`μž…λ ₯ν•˜μ‹  λ„ˆλΉ„ ${rectWidth}, 높이 ${rectHeight}의 μ‚¬κ°ν˜• λ„“μ΄λŠ” ${rectArea}μž…λ‹ˆλ‹€.`);
},
trapezoid(trapeTop, trapeBottom, trapeHeight, trapeArea) {
executionSequence.update('trapezoid');
console.log(`μž…λ ₯ν•˜μ‹  μœ—λ³€ ${trapeTop}, μ•„λž«λ³€ ${trapeBottom}, 높이 ${trapeHeight}의 사닀리꼴 λ„“μ΄λŠ” ${trapeArea}μž…λ‹ˆλ‹€.`);
},
cylinder(cylinRadius, cylinHeight, cylinArea) {
executionSequence.update('cylinder');
console.log(`μž…λ ₯ν•˜μ‹  λ„ˆλΉ„ ${cylinRadius}, 높이 ${cylinHeight}의 원기λ‘₯ λ„“μ΄λŠ” ${cylinArea}μž…λ‹ˆλ‹€.`);
}
};
/*
μž…λ ₯ 였λ₯˜ 점검 λ©”μ†Œλ“œ
*/
export const inputErr = { //inputErr.argsNumber.one(arr) || inputErr.argsType(arr)
hasWrongNumOfElems(arr, rightNumOfArgs) {// Check # of arguments if it's less or more
if(!arr[0]) {
console.log('아무 정보도 μž…λ ₯ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€');
return true;
}
if(arr.length < rightNumOfArgs) {
console.log('정보λ₯Ό 더 μž…λ ₯ν•˜μ…”μ•Ό ν•©λ‹ˆλ‹€.');
return true;
} else if(arr.length > rightNumOfArgs) {
console.log('λ„ˆλ¬΄ λ§Žμ€ 정보λ₯Ό μž…λ ₯ν•˜μ…¨μŠ΅λ‹ˆλ‹€');
return true;
}
},
argsType(arr) { // Check element of arguments if any NAN or negative/zero Integer
let argsTypeError = false;
function hasWrongInt(arr) {
function isElemNegativeOrZero(arr) {return arr.some((el) => el <= 0)}
if (isElemNegativeOrZero(arr)) {
console.log('0보닀 μž‘κ±°λ‚˜ 같은 값이 μžˆμŠ΅λ‹ˆλ‹€!');
argsTypeError = true;
}
}
function hasAnyNaN(arr) {
function nonNumberElem(arr) {return arr.some((el) => (typeof el != "number")? true : false)}
if (nonNumberElem(arr)) {
console.log('μˆ«μžκ°€ μ•„λ‹Œ μž…λ ₯값이 μžˆμŠ΅λ‹ˆλ‹€!');
argsTypeError = true;
}
}
hasWrongInt(arr);
hasAnyNaN(arr);
return argsTypeError;
}
};
/*
넓이 처리 λ©”μ†Œλ“œ
*/
export const area = {
circle(circleRadius) {
const circleArea = computeArea.circle(circleRadius);
const argList = Array.from(arguments);
if(inputErr.hasWrongNumOfElems(argList, 1) || inputErr.argsType(argList)) {return false;}
printArea.circle(circleRadius, circleArea);
},
growingCircle(startRadius, targetRadius) {
const argList = Array.from(arguments);
if(inputErr.hasWrongNumOfElems(argList, 2) || inputErr.argsType(argList)) {return false;}
if(startRadius > targetRadius){
console.log('μ‹œμž‘ λ°˜μ§€λ¦„ 넓이가 μ΅œμ’… λ°˜μ§€λ¦„λ³΄λ‹€ μž‘μŠ΅λ‹ˆλ‹€!');
return false;
}
for (let radius = startRadius; radius <= targetRadius; radius++) {
const circleArea = computeArea.circle(radius);
printArea.circle(radius, circleArea);
}
},
rect(rectWidth, rectHeight) {
const rectArea = computeArea.rect(rectWidth, rectHeight);
const argList = Array.from(arguments);
if(inputErr.hasWrongNumOfElems(argList, 2) || inputErr.argsType(argList)) {return false;}
printArea.rect(rectWidth, rectHeight, rectArea);
},
trape(trapeTop, trapeBottom, trapeHeight) {
const trapeArea = computeArea.trapezoid(trapeTop, trapeBottom, trapeHeight);
const argList = Array.from(arguments);
if(inputErr.hasWrongNumOfElems(argList, 3) || inputErr.argsType(argList)) {return false;}
printArea.trapezoid(trapeTop, trapeBottom, trapeHeight, trapeArea);
},
cylin(cylinRadius, cylinHeight) {
const cylinArea = computeArea.cylinder(cylinRadius, cylinHeight);
const argList = Array.from(arguments);
if(inputErr.hasWrongNumOfElems(argList, 2) || inputErr.argsType(argList)) {return false;}
printArea.cylinder(cylinRadius, cylinHeight, cylinArea);
}
};
/*
넓이 처리 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©μžκ°€ ν˜ΈμΆœν•˜κ²Œ λ•λŠ” λ©”μ†Œλ“œ
*/
export const getArea = function (...arg) {
let calcType = arg[0];
const argList = arg.splice(1);
if(calcType === 'circle' && argList.length >= 2) {calcType = 'growingCircle';}
switch (calcType) {
case 'circle':
area.circle(...argList);
break;
case 'growingCircle':
area.growingCircle(...argList);
break;
case 'rect':
area.rect(...argList);
break;
case 'trapezoid':
area.trape(...argList);
break;
case 'cylinder':
area.cylin(...argList);
break;
default:
break;
}
}
function greeting() {
console.log(
`λ‹€κ°ν˜• 넓이 κ³„μ‚°κΈ°μž…λ‹ˆλ‹€. μ•„λž˜ μ˜ˆμ‹œλ₯Ό 보고 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”
- 원 넓이: getArea('circle', λ°˜μ§€λ¦„ 숫자) [예: getArea('circle', 2)]
- 점점 μ»€μ§€λŠ” 원 넓이: getArea('circle', μ‹œμž‘ λ°˜μ§€λ¦„ 숫자, μ΅œλŒ€ λ°˜μ§€λ¦„ 숫자) [예: getArea('circle', 2, 5)]
- μ‚¬κ°ν˜•: getArea('rect', λ„ˆλΉ„, 높이) [예: getArea('rect', 2, 3)]
- 사닀리꼴: getArea('trapezoid', μœ—λ³€ 길이, μ•„λž«λ³€ 길이, 높이) [예: area('trapezoid', 2,3,5)]
- 원기λ‘₯: getArea('cylinder', λ°˜μ§€λ¦„, 높이) [예: getArea('cylinder', 2,5)]
`
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment