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 шт):

Автор решения: Grundy

На картинке с ошибками видно две ошибки.

  1. лишний \n в начале строки. Очевидная причина ошибки. метод write, в котором всегда безусловно добавляется перенос строки. Для решения достаточно проверить, что в contents уже что-то лежит и добавлять перенос только в этом случае, например:

     this._contents = `${this._contents.length ? this._contents+'\n':''}${str}`;
    
  2. вторая ошибка указывает на неверный ответ методов gets, getc. Результат получаемый в тесте - пустая строка. Такой результат получается из-за того, что _contents начинается с \n после добавления новой строки. И ошибка решится после исправления предыдущей. Однако стоит обратить внимание, на неверную логику с пустой строкой в этих функциях. Условие

     if(this._contents.length === 0){
    

    в данном случае лишнее, так как вместо ожидаемого undefined вернет пустую строку.


Если пройтись по имеющемуся коду можно также провести следующие улучшения:

  1. разбиение на расширение и имя файла. Чтобы получить последний элемент массива можно воспользоваться методом .pop в этом случае элемент удалится из исходного массива. Таким образом сразу получается расширение и массив для имени:

     this._extension = fullNameArray.pop();
     this._filename = fullNameArray.join('.');
    
  2. Пустые сеттеры можно убрать.

  3. использовать постфиксный оператор непосредственно в выражении. Так как постфиксный оператор возвращает предыдущее значение, его можно использовать сразу в получении строки либо символа:

     return this._contents.split('\n')[this._currentLineToRead++];
     return this._contents[this._currentCharToRead++];
    
→ Ссылка