1) .gitignore 추가 - 1b28660
2) eslint, jest, package.json 설정 - 12796cc
- eslint는 airbnb 컨벤션으로 설정했다.
- 테스트코드를 jest기반으로 작성하기 위한 환경을 설정했다.
3) 당장 해결할 수 있는 lint error 해결 - 55ecece
4) main.ts 내의 클래스들을 파일 단위로 분리 - 3dcfe32
5) 구조적으로 적절한 Road 클래스 생성 및 정리 - 44a2352
5) 앞서 해결못한 lint 에러 해결 및 코드 리팩토링 - ceb88e9
- wheel.js 파일명의 첫글자를 대문자로 변경하려 했으나 git이 대소문자 변경의 tracking을 못하는 문제가 있어
git config core.ignorecase false를 사용하려 해결하려 했지만 실패했다. 기존 파일이 스테이지에 올라가있는 상태에서 파일명의 대소문자만 변경할 경우 tracking이 되긴 하지만 새로운 파일로 간주해버리게 된다. 따라서 문제를 해결하기 위해서는git mv wheel.js Wheel.js와 같이git mv를 사용하여 파일명을 변경하면 된다.- git에서 이런 문제가 발생하는 이유는 git이 운영체제 파일 시스템을 따라서인데 Windows나 Mac OS의 파일시스템에서 대소문자가 달라도 같은 파일로 인식하기 때문이다.
6) jest기반의 테스트코드 추가 - fe36021
- TypeScript에서
describe-context-it중context를 사용하려면jest-plugin-context가 필요하며, TypeScript의 경우 추가적으로@types/jest-plugin-context를 설정해줘야 한다.
- 가독성, 유지보수, 생산성, 협업 등 모든 측면에서 본인이 생각하기에 코드 퀄리티를 높이는 방향으로 리팩토링해주세요.
- 코드의 의도(차량이 도로를 달리는 현실세계를 표현)를 유지하는 선에서 코드의 모든 영역(네이밍, 파일 구조, 프로그래밍 패러다임, 패턴, 라이브러리, …)에 대해 수정을 가해도 괜찮습니다.
- 예시 코드는 타입스크립트로 작성되었으나, 다른 원하시는 언어가 있다면 그 언어를 사용하실 수 있습니다. 단, 가능하면 정적 타입이 포함된 언어로 작성해주세요. 슈도코드도 가능합니다.
- 작업하는 코드는 깃허브에 올려주세요. 만약 여러 커밋에 걸쳐서 작업하신다면 깃 히스토리가 남겨지도록 작업해주세요.
- 서류 제출 시, 작업하신 깃허브 레포지토리의 링크를 같이 제출해주세요.
import { Wheel } from './main';
export default class Vehicle {
private numberOfWheels: number; // bigger than -1
public wheels: Wheel[];
private fuel: number; // 0~100
constructor(numberOfWheels: number, wheels: Wheel[], fuel: number) {
this.numberOfWheels = numberOfWheels;
this.wheels = wheels;
this.fuel = fuel;
}
public getNumberOfWheels() { return this.numberOfWheels; }
public getFuel() {return this.fuel; }
}import Vehicle from './Vehicle';
export class Wheel {
public kind: string;
public rpm: number = 0;
constructor(kind) { this.kind = kind; }
public setNewRPM(r: number) {
this.rpm = r;
}
}
class Car extends Vehicle {
// 시동을 켠다
public run() {
for (let i = 0; i < this.getNumberOfWheels(); i++) {
this.wheels[i].rpm = 5;
}
}
public isRoadEmpty(vehicles: Vehicle[]) {
return vehicles.length === 0;
}
}
class Bike extends Vehicle {
// 페달을 밟는다
public start(){
for (let i = 0; i < this.getNumberOfWheels(); i++) {
this.wheels[i].rpm = 8;
}
}
public isRoadEmpty(vehicles: Vehicle[]) {
return vehicles.length === 0;
}
}
// ------------
const road: Vehicle[] = [];
const car = new Car(4, [new Wheel("rubber"),new Wheel("rubber"),new Wheel("rubber"),new Wheel("ribber")], 100);
const bike = new Bike(2, [new Wheel("plastic"), new Wheel("plastic")], 50);
road.push(car);
road.push(bike);
car.run();
bike.start();
console.log("All vehicles on road: ", road);
console.log("isEmpty: ", car.isRoadEmpty(road));