Conversation
| } | ||
| public int Size() |
There was a problem hiding this comment.
Между методами нужна пустая строка
| } | ||
| private bool AddToVertex(Vertex vertex, string element, int position) |
There was a problem hiding this comment.
Снова не хватает пустой строки между методами
| var vertex = FindVertex(prefix); | ||
| if (FindVertex(prefix) != null) |
There was a problem hiding this comment.
В if стоит vertex передать, а не второй раз FindVertex(prefix) вычислять :)
| return true; | ||
| } | ||
|
|
||
| public bool Add(string element) |
There was a problem hiding this comment.
В публичный метод могут передать что угодно. Стоит проверить, не null ли строка.
Ваш класс кто-то может решить использовать в своем проекте, например. Будет неприятно свалиться с NullReferenceExpression при передаче некорректного значения в метод класса :)
| public Dictionary<char, Vertex> NextVertices; | ||
|
|
||
| public int NumberOfTerminalVertices; | ||
|
|
||
| public bool IsTerminal; |
There was a problem hiding this comment.
Если поле назвать с заглавной буквы от этого оно не станет свойством :) А публичные поля - зло.
Вам подойдут свойства со стандартным getter и setter:
public bool IsTerminal { get; set; }| return isAdded; | ||
| } | ||
|
|
||
| public bool Contains(string element) |
There was a problem hiding this comment.
Сюда тоже в качестве аргумента могут передать null. Нужна проверка на то, что переданный аргумент не null
There was a problem hiding this comment.
А проверка так и не появилась... Теперь нужно еще добавить тесты, где вы в качестве аргументов в публичные методы Бора передаете null :)
| return current; | ||
| } | ||
|
|
||
| private Tuple<bool, bool> RemoveFromVertex(Vertex vertex, string element, int position) |
There was a problem hiding this comment.
Не очень очевидно без копания в коде, что вообще вы возвращаете из этого метода. Во все неочевидные на ваш взгляд места добавляйте, пожалуйста, комментарии. Разработчик, который будет сопровождать написанный вами код, не будет вас поминать плохим словом в таком случае :)
Если кратко, то по названию метода RemoveFromVertex непонятно, что он делает. Может быть Remove что-то FromVertex? И еще сложно понять, что же метод возвращает. Полезны будут комментарии
| if (vertex.NextVertices.ContainsKey(element[position])) | ||
| { | ||
| try | ||
| { | ||
| var isAdded = AddToVertex(vertex.NextVertices[element[position]], element, ++position); | ||
| if (isAdded) | ||
| { | ||
| ++vertex.NumberOfTerminalVertices; | ||
| return true; | ||
| } | ||
| } | ||
| catch | ||
| { | ||
| return false; | ||
| } |
There was a problem hiding this comment.
Блок try ... catch используется, когда вы ожидаете, что вызываемый код может выбросить исключение. Ваш метод никакие исключения не бросает.
Представьте, вы написали метод не очень корректно и на самом деле падаете периодически с NullReferenceExpression, но из-за блока try ... catch вы можете долго пытаться понять в чем проблема
There was a problem hiding this comment.
Все еще не понимаю: зачем вам здесь try ... catch? :)
| return; | ||
| } | ||
|
|
||
| Console.WriteLine("To add an element press 1\nTo remove press 2\nTo check if the particular word contains press 3\n" + |
There was a problem hiding this comment.
Можно:
Console.WriteLine("""
To add an element press 1
To remove press 2
To check if the particular word contains press 3
To count words with the same prefix press 4
To quit press 0
""");| var word = Console.ReadLine(); | ||
| if (word == null) | ||
| { | ||
| Console.WriteLine("A null-reference"); | ||
| return; | ||
| } | ||
| var isAdded = trie.Add(word); | ||
| if (isAdded) | ||
| { | ||
| Console.WriteLine("A new word has been just added"); | ||
| } | ||
| else | ||
| { | ||
| Console.WriteLine("A word hasn't been added, it already exists"); | ||
| } |
There was a problem hiding this comment.
А здесь пользователь может ввести Enter, в таком случае Console.ReadLine вернет пустую строку. А вы напишите: A word hasn't been added, it already exists. Что не является правдой. Поправьте, пожалуйста
| if (vertex.NextVertices.ContainsKey(element[position])) | ||
| { | ||
| try | ||
| { | ||
| var isAdded = AddToVertex(vertex.NextVertices[element[position]], element, ++position); | ||
| if (isAdded) | ||
| { | ||
| ++vertex.NumberOfTerminalVertices; | ||
| return true; | ||
| } | ||
| } | ||
| catch | ||
| { | ||
| return false; | ||
| } |
There was a problem hiding this comment.
Все еще не понимаю: зачем вам здесь try ... catch? :)
| ///<summary> Recursively checks if the given element exists in the tree. If it does, returns a pair of bool values: 1st - | ||
| /// true, 2nd - if there is no other elements after the current. If the second value is true, we can delete a | ||
| /// branch. </summary> |
There was a problem hiding this comment.
У вас тут комментарий поехал, нужно:
/// <summary>
/// Recursively checks if the given element exists in the tree. If it does, returns a pair of bool values: 1st -
/// true, 2nd - if there is no other elements after the current. If the second value is true, we can delete a branch.
/// </summary>| ///<summary> Recursively checks if the given element exists in the tree. If it does, returns a pair of bool values: 1st - | ||
| /// true, 2nd - if there is no other elements after the current. If the second value is true, we can delete a | ||
| /// branch. </summary> | ||
| private Tuple<bool, bool> RemoveWordFromVertex(Vertex vertex, string element, int position) |
There was a problem hiding this comment.
Этот метод берет на себя слишком много: и удаляет слово, и еще какую-то дополнительную информацию возвращает, не относящуюся напрямую к операции удаления. В общем, он разве что кофе не варит :)
Метод все-таки должен идейно что-то одно делать: пускай он удаляет слово и возвращает bool - индикатор успешности проведенной операции.
Декомпозируйте, пожалуйста :)
| return isAdded; | ||
| } | ||
|
|
||
| public bool Contains(string? element) |
There was a problem hiding this comment.
Из-за того, что вы позволяете в качестве аргумента в метод Contains передавать null, nullability-анализ не выдаст пользователю warning при попытке передачи null в качестве аргумента.
Это плохо, потому что в целом аргумент Contains не должен быть null, хорошо бы, чтобы nullability-анализ имел возможность пользователю об этом напомнить
| { | ||
| Console.WriteLine("Not a number"); | ||
| return; | ||
| } |
There was a problem hiding this comment.
Нужно все на 4 пробела влево сместить
| public Dictionary<char, Vertex> NextVertices | ||
| { | ||
| get => this.nextVertices; | ||
| } |
There was a problem hiding this comment.
Стоит использовать auto-implemented properties
| public int NumberOfTerminalVertices | ||
| { | ||
| get => numberOfTerminalVertices; | ||
| set => numberOfTerminalVertices = value; | ||
| } |
| if (prefix.Length == 0) | ||
| { | ||
| return _sizeOfTrie; | ||
| } |
There was a problem hiding this comment.
С чего бы? :) Пустая строка в Боре не содержится
There was a problem hiding this comment.
Все еще пустая строка в Боре не содержится. Поправьте, пожалуйста
| return isDeleted.Item1; | ||
| } | ||
|
|
||
| public int HowManyStartsWithPrefix(String prefix) |
There was a problem hiding this comment.
А тут вам null могут передать, нужна проверка на null
| return new Tuple<bool, bool>(false, false); | ||
| } | ||
|
|
||
| public bool Remove(string? element) |
There was a problem hiding this comment.
Тут то же самое, что и в методе Contains, нужно string element вместо string? element
| _sizeOfTrie = 0; | ||
| Size = _sizeOfTrie; |
There was a problem hiding this comment.
Так поле _sizeOfTrie на самом деле вам не нужно (кроме того, инициализировать поле нулем было не нужно, в .NET итак все объекты имеют значения по умолчанию, у int это как раз 0). А не нужно потому, что auto-implemented property можно создать так:
public int Size { get; private set; }.
С приватным set вы сможете поддерживать значение свойства Size в актуальном состоянии
| return true; | ||
| } | ||
|
|
||
| public bool Add(string? element) |
There was a problem hiding this comment.
Из-за того, что вы позволяете в качестве аргумента в метод Add передавать null, nullability-анализ не выдаст пользователю warning при попытке передачи null в качестве аргумента.
Это плохо, потому что в целом аргумент Add не должен быть null, хорошо бы, чтобы nullability-анализ имел возможность пользователю об этом напомнить.
Кстати, уже была пара комментариев об этом :) Все-таки ожидается, что вы внимательно изучаете комментарии и исправляете свои ошибки
| return isAdded; | ||
| } | ||
|
|
||
| public bool Contains(string element) |
There was a problem hiding this comment.
А проверка так и не появилась... Теперь нужно еще добавить тесты, где вы в качестве аргументов в публичные методы Бора передаете null :)
| if (prefix.Length == 0) | ||
| { | ||
| return _sizeOfTrie; | ||
| } |
There was a problem hiding this comment.
Все еще пустая строка в Боре не содержится. Поправьте, пожалуйста
No description provided.