Fun with ES6 Classes #6 - Fake Files (Basic) Codewars
Ссылка на задачу: https://www.codewars.com/kata/5784c8116211383b5f0001d3
Написал следующий код, для решения вышеуказанной задачи:
class File {
constructor(fullName, contents){
const fullNameArray = fullName.split('.');
const fileNameArray = fullNameArray.filter((el,i)=> i !== fullNameArray.length-1);
this._fullName = fullName;
this._filename = fileNameArray.join('.');
this._contents = contents;
this._extension = fullNameArray[fullNameArray.length-1];
this._currentLineToRead = 0;
this._currentCharToRead = 0;
}
get fullName(){
return this._fullName;
}
set fullName(fullName){
return;
}
get filename(){
return this._filename;
}
set filename(filename){
return;
}
get extension(){
return this._extension;
}
set extension(extension){
return;
}
getContents(){
return this._contents;
}
write(str){
this._contents = `${this._contents}\n${str}`;
}
gets(){
if(this._contents.length === 0){
return '';
}
const res = this._contents.split('\n')[this._currentLineToRead];
this._currentLineToRead++;
return res;
}
getc(){
if(this._contents.length === 0){
return '';
}
const res = this._contents[this._currentCharToRead];
this._currentCharToRead++;
return res;
}
}
Первичные тесты проходят успешно.

Но после клика на attempt, мне указывают на то,
что мои методы класса не рабочие.

Я понимаю, что ошибка где-то в коде, но никак не могу ее найти. Буду благодарен за помощь.
Ответы (1 шт):
На картинке с ошибками видно две ошибки.
лишний
\nв начале строки. Очевидная причина ошибки. методwrite, в котором всегда безусловно добавляется перенос строки. Для решения достаточно проверить, что в contents уже что-то лежит и добавлять перенос только в этом случае, например:this._contents = `${this._contents.length ? this._contents+'\n':''}${str}`;вторая ошибка указывает на неверный ответ методов
gets,getc. Результат получаемый в тесте - пустая строка. Такой результат получается из-за того, что_contentsначинается с\nпосле добавления новой строки. И ошибка решится после исправления предыдущей. Однако стоит обратить внимание, на неверную логику с пустой строкой в этих функциях. Условиеif(this._contents.length === 0){в данном случае лишнее, так как вместо ожидаемого
undefinedвернет пустую строку.
Если пройтись по имеющемуся коду можно также провести следующие улучшения:
разбиение на расширение и имя файла. Чтобы получить последний элемент массива можно воспользоваться методом
.popв этом случае элемент удалится из исходного массива. Таким образом сразу получается расширение и массив для имени:this._extension = fullNameArray.pop(); this._filename = fullNameArray.join('.');Пустые сеттеры можно убрать.
использовать постфиксный оператор непосредственно в выражении. Так как постфиксный оператор возвращает предыдущее значение, его можно использовать сразу в получении строки либо символа:
return this._contents.split('\n')[this._currentLineToRead++]; return this._contents[this._currentCharToRead++];