Тема: Мій перший репозиторій на GitHub
хей, привітулі усім, ось збацав свій перший репозиторій, думаю, непогано було б, якби хтось втикнув і
покритикував це все
ось лінк, хе-хе, бо я його одразу й не додав
https://github.com/mHerasimov/Trie
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системи контролю версій (SCM, VCS) → Мій перший репозиторій на GitHub
Для відправлення відповіді ви повинні увійти або зареєструватися
хей, привітулі усім, ось збацав свій перший репозиторій, думаю, непогано було б, якби хтось втикнув і
покритикував це все
ось лінк, хе-хе, бо я його одразу й не додав
https://github.com/mHerasimov/Trie
Я, взагалі, не знаю Java, але скажу по такому. За таке Commit #3 - можна відрубувати руки.
Я, взагалі, не знаю Java, але скажу по такому. За таке Commit #3 - можна відрубувати руки.
це в Readme, в принципі погоджуюсь, але що ж я там напишу, якщо відредактував пару рядочків
Q-bart написав:Я, взагалі, не знаю Java, але скажу по такому. За таке Commit #3 - можна відрубувати руки.
це в Readme, в принципі погоджуюсь, але що ж я там напишу, якщо відредактував пару рядочків
пишіть, що відредактував рядки, що відповідають за таке-то, з такою-то метою
FakiNyan написав:відредактував рядки
Прийнято писати "Add readme.md", а не "Added readme.md". Ну тобто відмінок не той.
ну я то пойняв, коли в недокоманді з двох з половиною людей працював
FakiNyan написав:відредактував рядки
Прийнято писати "Add readme.md", а не "Added readme.md". Ну тобто відмінок не той.
Так, і ще, чудова стаття про загальні принципи використання git - http://codeguida.com/post/277/
Англійську тра підовчити. Сам код намагався переглянути, але дуже багато коду, стало влом. Єдине, що точно можна сказати - розбиття окремих логічних шматочків на функції - це дуже добре. Ну і ідея доволі непогана. Але ще раз нагадаю за англійську - то бідонька
1. - пишіть у комітах що ви робите
2. - виключіть файл.idea/workspace.xml - він дуже часто міняється
3. + кльово що є рідмі
4. - спробуйте протестувати свій код (не знаю чи дял джави є ci сервіси)
6. - поправте шаблони ( // TODO Auto-generated constructor stub)
п.с. я віддаю перевагу { } але це особисте. у вас знайшов таку штуку if(isDAWG) throw new IllegalStateException();
Доброго дня,
вітаю з першим репо! Хотів би виділити кілька пунктів (деякі з повторенням):
- Дуже гарний README.md
- Необхідно виключити файли Ваших IDE, бо вони узалежнюють проект від Вашого вибору середовища. Найпростіший варіант - оновити .gitignore. Ось тут є приклад: https://github.com/github/gitignore/blo … .gitignore . Ідеально перейти на Maven/Gradle.
- Dictionary.txt теж є непотрібний для Вашої реалізації. Я розумію що цей файл для тесту, але якщо він таким є, то має мати під себе якийсь Unit test.
- Щодо коду, то я б назвав Вашу реалізацію непрактичною і з зіпсованим рівнем абстракції. Коли необхідно використати якусь структуру даних, ви очікуєте щонайменше 2 операції: покласти дані, дістати дані. У Вас є метод add(Ключ, Дані), але немає get(Ключ). Натомість є get що повертає Node. Звичайно, через Node можна дістатися до даних, але Node це не те що ви "клали" у цю структуру. Node це внутрішня презентація даних і вона має бути прихована. Розгляньте можливість імплементації вбудованих інтерфейсів колекцій, на приклад Map. Усі стандартні реалізації дерев у Java імплементують його. Можливо для Ваших потреб він теж підійде.
- Чому клас final? Не бачу потреби закривати його.
- Чому Ви використовуєте factory-method createNewTrie замість конструктора? Він не робить нічого, окрім ініціалізації самого класа, самої структури даних. Це завдання для конструктора.
- Винесіть запис у файл/теці з Trie.java. Ваші класи мають виконувати якусь 1 справу, не комбінуйте. Для цього краще створіть клас TrieIO зі статичними методами запису й зчитування Trie у якій помістіть код з Saver.java (жахлива назва для класу, не робіть так. Saver чого? Тексту, картинок, списків? Незрозуміло), Loader.java (та сама ситуація) та методи запису з Trie.
- Непотрібна папка Trie. Не засмічуйте репозиторій, і так зрозуміло з назви що це Trie Тобто замість MikeHerasimov/Trie/Trie/src/trie/Saver.java має бути MikeHerasimov/Trie/src/trie/Saver.java.
- Розгляньте можливість зміни назви пакету за Java Package Naming Convention. На приклад, на com.github.mikeherasimov.trie.Trie.
- Текст комітів , вже писали вище.
Помилки всі звичайно не смертельні. Вітаю Вас з 1 репо, пищіть ще!
У приклад можу підкинути один зі своїх репо: https://github.com/wingsofovnia/canopus/tree/develop.
Якщо будуть ще питання - задавайте, допоможемо!
Доброго дня,
вітаю з першим репо! Хотів би виділити кілька пунктів (деякі з повторенням):
- Дуже гарний README.md
- Необхідно виключити .....
....
Якщо будуть ще питання - задавайте, допоможемо!
Змістовно проаналізував роботу, ніби вчитель: "- Ось тут поправ, ось тут видали, тут прорахуй, а загалом оцінка Добре"
хей, привітулі усім, ось збацав свій перший репозиторій, думаю, непогано було б, якби хтось втикнув і
▼Прихований текстпокритикував це все
ось лінк, хе-хе, бо я його одразу й не додав
https://github.com/MikeHerasimov/Trie
У якості навчального прикладу з Pull Request`ів на GitHub, зробив Вам запит на Pull Request з деякими змінами, про які йшлося у цій темі. До того ж переніс процес збирання проекту на Maven (в IDEA такий проект імпортується наступним чином: File -> Import Project і треба вибрати там pom.xml).
Доброго дня всім, рідко заходжу на ріплейс - тому сорі, що вчасно не відповів.
Тільки вчора ввечері побачив мейл від GitHub про pull request і сьогодні зранку побачив лінк сюди з повідомлення iovchynnikov
Відверто кажучи думав, що тема мертва, чуваки, ви мене приємно здивували
Бачу, що всі пости датуються 23-24 числом, коли я залив версію 2.0.0 в понеділок 25-го
Основні зміни у версії 2.0.0
розбив class Trie (tagged class) на ієрархію класів і інтерфейсів
додав ще одну реалізацію ArrayTrie з відповідним ArrayDAWG, до якого воно може бути приведене
видалив Saver і Loader класи
Велике дякую панові iovchynnikov за те, що не пошкодували часу і подивилися на код (щоправда паскудний)
Ви багато написали, дещо уже зробив у версії 2, дещо стараюсь переварити.
Поки що буду розбиратись з pull request`ом і гляну на приклад, який Ви мені надали. Дякую за привітання, писатиму ще
І, до речі, якщо матимете час гляньте, будь ласка, на версію 2.0.0, мене цікавить Ваша думка
1. - пишіть у комітах що ви робите
2. - виключіть файл.idea/workspace.xml - він дуже часто міняється
3. + кльово що є рідмі
4. - спробуйте протестувати свій код (не знаю чи дял джави є ci сервіси)
6. - поправте шаблони ( // TODO Auto-generated constructor stub)п.с. я віддаю перевагу { } але це особисте. у вас знайшов таку штуку if(isDAWG) throw new IllegalStateException();
зі всім згоден, в другій версії залишив тестові класи
про пі сі: знайомий з Австрії теж акцентував на цьому увагу- тому в версії 2.0.0 старався дотримуватись такого синтаксису, навіть якщо тіло займає всього один рядочок
if(<expression>) {
// do some stuff
} else {
// do something else
}
як він казав це робить код більш читабельним
тільки у методі equals() я відмовився від такого синтаксису
Regen шле усім вітання!
На даний час працюю з серіалізацією/десереалізацію обох реалізацій.
Щоправда з ручною, без використання Serializable.
З алгоритмами розібрався (роблю усе як тут http://articles.leetcode.com/2010/09/se … inary.html), хотів створити mixin TrieIO з двома методами
void saveTrie(String filename);
static Trie loadTrie(String filename);
Покруч у тім, що Java 7 не дозволяє додавати static методи до інтерфейсів, Java 8 хоч і дозволяє, але потрібно додати до нього тіло і в будь-якому випадку @Override для статичних методів не може бути застосованим, через те, що вони resolvable at compile time.
Я використовую FileChannel з ByteBuffer`ом щоб записати char[], який згенерував наданим алгоритмом, звісно можна заюзати Serializable і записати масив char`ів з допомогою writeObject, але запис з допомогою FileChannel є досить таки швидшим.
Може маєте якісь ідеї?
хотів створити mixin TrieIO з двома методами
void saveTrie(String filename); static Trie loadTrie(String filename);
Чому saveTrie не статичний?
Покруч у тім, що Java 7 не дозволяє додавати static методи до інтерфейсів, Java 8 хоч і дозволяє, але потрібно додати до нього тіло і в будь-якому випадку @Override для статичних методів не може бути застосованим, через те, що вони resolvable at compile time.
Навіщо ти його магаєшся надписати?
Може маєте якісь ідеї?
Щодо чого? Конкретніше. Бо ти сам собі відповідаєш у повідомленні.
а чому saveTrie має бути статичним
?
він ж застосовується до певного екземпляра Trie, а не просто до класу
loadTrie статичний, бо я хочу, щоб можна було застосовувати щось таке
Trie trie = Trie.loadTrie("myAwesomeTrie.txt")
Я хочу зробити це у вигляді mixin'а (інтерфейса). Щоб обидві реалізації (ArrayTrie, LinkedTrie) реалізовували його і щоб код був більш розширюваним, тобто коли я буду робити ще одну реалізацію я б міг просто реалізувати інтерфейс і написати тіло таких методів.
Ось як я хочу, щоб все виглядало, правда зараз бачу, що це неможливо
public interface TrieIO {
void saveTrie(String filename);
static Trie loadTrie(String filename);
}
public class ArrayTrie implements Trie, TrieIO {
...
}
public class LinkedTrie implements Trie, TrieIO {
...
}
Ідеї щодо архітектури, бо та яка була найбільш очевидною не працює, може є якийсь патерн, що дозволить мені зробити подібну річ?
Я вже казав як, з моєї точки зору, краще зробити. TrieIO немає нічого спільного з Trie. Trie - структура даних, TrieIO клас для запису до файлів. Приклад: Фабрика(TrieIO), що виготовляє дизельне пальне; дизельне пальне звичайне (Trie); дизельне пальне з домішками (ArrayTrie). То чому дизельне пальне з домішками має окрім звичайного пального, успадковувати властивості і поведінку фабрики, що його виготовляє?
interface Trie {
void add(String s);
}
class ArrayTrie implements Trie {
//
}
final class TrieIO {
Trie readFromFile(String filename);
void writeToFile(Trie tree, String filename);
}
Якщо ж ти все ж таки хочеш, щоб кожен різновид Trie сам релізовував записування, считування (робити це доцільно якщо кожна структура по різному себе записує. ArrayTrie записує 1 2 3... у файл, а LinkedTrie має зовсім інший [1],[2]...) можна так:
interface Trie {
void add(String s);
}
interface SerializableTrie {
void serialize(String filename);
Trie deserialize(String filename);
}
class ArrayTrie implements Trie, SerializableTrie {
void add(String s) {}
void serialize(String filename) {}
Trie deserialize(String filename) {}
}
Але я думаю твої колекції будуть записуватися однаково, тільки у пам'яті будуть по інакшому виглядати.
Для відправлення відповіді ви повинні увійти або зареєструватися