1

(21 відповідей, залишених у Java)

iovchynnikov працюючи на довгостроковому проекті я зрозумів що робити композицію легше і безпечніше ніж наслідувати обєкти.
Робити мікс функціоналу з композицією можна без проблем. А що робити з наслідуванням?
Наприклад у анс буде LoggablePuzzle extends Puzzle який містить функціонал - відправляй у лог всі букви які відкриваються.
І тут у вас появляється задача. Якщо стається exception у методі open ви маєте також відправити його у лог, але уже у інший. І викинути exception нагору, кого тоді наслідувати і як ;)

2

(21 відповідей, залишених у Java)

3. Ідея зрозуміла. Але от наприклад мені треба буде статистика по буквах які народ найчастіше вгадує. Я зроблю дуже просто. Напишу клас LoggablePuzzle

Прихований текст
public class LoggablePuzzle implements PuzzleInterface {

    public LoggablePuzzle(PuzzleInterface original, LogInterface log) {
        this.original = original;
    }

    @Override
    public boolean contains(Character letter) {
        return this.original.contains(letter);
    }

    @Override
    public PuzzleInterface open(Character letter) {
        PuzzleInterface result = this.original.open(letter);
        this.logger.logLetter(letter);
        return result;
    }

}

Я згідний що типу це надуманий приклад. Але це все також з особистого досвіду. Я мабуть ще створю подібну тему в PHP і покажу як було і як стало уже на реальному проекті і з реальними задачами.

3

(21 відповідей, залишених у Java)

Треба було мені назвати не RoundInterface a JudgeInterface і метод не handle а operate Тоді мабуть менше б було плутанитит
У роль вступає 10 суддів, по черзі вони щось вирішують. Хтось приймає рішення про те чи можна відгадувати чи ні, хтось показує рахунок а хтось питає у клієнта букву. Що скажете ;)

4

(21 відповідей, залишених у Java)

iovchynnikov дякую ;)
1. ок ;)
2. Так я уже вище погодився що можна обійтись і без game
3. Я частково згідний але частково ні)) Що значить 100% будуть мати одну реалізацію? Якщо не враховувати GameInterface - назвати приклад інтерфейсу який буде 100% реалізовано тільки один раз?
4. Наскільки я розумію MessageInterface мав бути Message а як тоді назвати клас Message ?
5. Тут згідний 100%
6. Типу оголошуємо змінну і змінній присвоюємо інстанс обєкту? Це діло привички, мені раніше також було важко це зробити. Але зараз дуже зручно. Але вашу точку зору я розумію, спочатку це може взривати мозок.
7.  як назвати метод handle ? Типу вступауй у роль твоя черга) Мені здається як його не назви ніяк добре не буде)) Якщо можете наведіть ще приклади де є погані назви методів.

Нарешті 0) ну тут 100% але ви розумієте що LOC це взагалі не показник. Візьміть метрику NPath ;)
Як я писав вище основна ідея це написати код який легко розширити і змінити. І ви прекрасно розумієте що у оригінальному варіанті ми ще можемо додати якісь там 2-4 умови і доповнювати алгоритм. Але настане момент коли ми не зможемо безболісно вклинюватись в процес.
Ще одна перевага у 800LOC це тести. Попробуйте напишіть тести для старої версії. У вас буде здоровий тест який завжди запускаєм main і перевіряє що він виводить)

Дуже вам вдячний за ревю і за посилання ;) Над деякими штуками дійсно варто задуматись.

5

(21 відповідей, залишених у Java)

2. Я тепер зрозумів про що ідеться мова. Стиль коду у кожної команди і у кожного програміста свій.
Попробував переписати і вийшло класно:

ResultInterface result;
do {
  result = round.handle(this.output, puzzle);
  puzzle = result.puzzle();
} while (result.next());

3. Якщо у конструкторі викликати validate у нас нічого не зміниться в плані логіки. При ініціалізації обєкта будемо обходити масив із багатьма елементами. Другий варіант із прапорцем validate можливий.

4. Можливо я щось не те сказав, але я тільки за вашу критику.
Постарався обгрунтувати свою позицію у деяких питаннях і написати чому саме я так зробив. Претензій у мене до вас немає, я навпаки вдячний за увагу і за ревю ;)

6

(21 відповідей, залишених у Java)

2. Гайд простий https://github.com/funivan/hangman/blob … /README.md
mvn clean package
java -classpath target/classes hangman.Main
дальше відгадуєте слова ;)
3. Якщо у анс буде 1e5 слів тоді перебирати всі у конструкторі і проводити їхню валідацію буде напряжно. тут є ще один профіт у тому що ми не кидаємо exception в конструкторі.
Ми можемо написати враппер SafeRound реалізувати RoundInterface і там робити try catch якщо щось зламається ми виводимо помилку але не буде помилки при конструюванні обєктів. Тут дуже багато нюансів і у кожного свій стиль написання. Останнім часом стараюсь юзати цей підхід http://www.yegor256.com/2015/05/07/ctor … -free.html

4. Тут проблеми з назвами мабуть. Round Interface- це набір дій які мають виконуватись. У нас є наприклад клас SuccessRoundTrack
вся його задача це вивести меседж коли ми успішно вгадали. Сама пузля нічого не знає про try_open вона не займається цим.
round.handle не означає що ми зараз відкриємо букву. Один з класів - наприклад ProgressPanel буде показувати нам прогрес бар.   
Тому я в пузлю не закидував try_open

7

(21 відповідей, залишених у Java)

1. Згідний фактично можна занести код game у Main.java і викинути клас Game
2. codestyle ;)
3. Це спеціально так зроблено. Раніше ішов тим самим шляхом - помилки в конструкторі. Але зараз відказався від цієї технології. Ми можемо клас ініціалізувати вище, але не факт що весь функціонал ми будемо використовувати. Відповідно не завжди треба ця штука. Тут тільки тести писати.
4. Можливо покажете прототип методу. На різних стадіях раунду нам треба з puzzle зробити різну штуку. Взяти кількість відкритих букв, відкрити букви, та інше.  Покищо не знаю як це оптимізувати.

8

(21 відповідей, залишених у Java)

Master_Sergius якщо я вас правильно зрозумів:
Це консольна гра. Але нам треба її розширювати. Тут основна ідея в архітектурі.

9

(21 відповідей, залишених у Java)

Master_Sergius розібємо, але розширювати буде не можливо. ;)
Наприклад ось вам ситуація.
До цього процедурного коду треба додати такі алгоритми:
1. Показувати прогрес бар у вигляді `====>-----` тобто якщо вгадали 50%  слова показуємо пять символів = потім пять символів -
2. Якщо у юзера залишилась 1на спроба і він відгадав менше 40% - відкриваємо всі голосні

10

(21 відповідей, залишених у Java)

Master_Sergius це не всі так пишуть. Це я так написав. По такому самому стилю пишу в PHP
У яві як і у інших мовах є тулзи для оцінки стилю. Але ніхто вам не скаже що не можна вкладувати 10 обєктів один в один або викликати підряд 10 new new не можна ;)

Чим цей стиль вам кращий ?

Прихований текст
 String word = WORDS[new Random().nextInt(WORDS.length)];
        boolean[] visible = new boolean[word.length()];
        int mistakes = 0;
        try (final PrintStream out = new PrintStream(this.output)) {
            final Iterator<String> scanner = new Scanner(this.input);
            boolean done = true;
            while (mistakes < this.max) {
                done = true;
                for (int i = 0; i < word.length(); ++i) {
                    if (!visible[i]) {
                        done = false;
                    }
                }
                if (done) {
                    break;
                }
                out.print("Guess a letter: ");
                char chr = scanner.next().charAt(0);
                boolean hit = false;
                for (int i = 0; i < word.length(); ++i) {
                    if (word.charAt(i) == chr && !visible[i]) {
                        visible[i] = true;
                        hit = true;
                    }
                }
                if (hit) {
                    out.print("Hit!\n");
                } else {
                    out.printf(
                        "Missed, mistake #%d out of %d\n",
                        mistakes + 1, this.max
                    );
                    ++mistakes;
                }
                out.append("The word: ");
                for (int i = 0; i < word.length(); ++i) {
                    if (visible[i]) {
                        out.print(word.charAt(i));
                    } else {
                        out.print("?");
                    }
                }
                out.append("\n\n");
            }
            if (done) {
                out.print("You won!\n");
            } else {
                out.print("You lost.\n");
            }
        }

11

(21 відповідей, залишених у Java)

Взагалі то я PHP розробник. Але деколи пишу на java
Шукаю гуру програмістів які можуть зробити код ревю і вказати на помилки.


git clone https://github.com/funivan/hangman

mvn clean package
java -classpath target/classes hangman.Main

12

(6 відповідей, залишених у PHP)

Наче і ооп а наче і ні ;)

у контроллер треба передавати базу даних ззовні а не ініціалізувати її в контроллері.

13

(16 відповідей, залишених у PHP)

@varkon ок) але у моїх реченнях немає нічого не технічного :)

14

(16 відповідей, залишених у PHP)

Код дійсно далекий від ідеального, але будь ласка, використовуйте професійну термінологію більш коректно. Ви ж не на форум домогосподарок пишете.

Буду дуже вдячний якщо ви скажете мені які не професійні терміни я використовую, і в професійному світі як правильно написати ;)

Чому б вам тоді не зробити зауважень про відсутність моделі?

Вирішив все не описувати. Згідний, можна вказати.

Це теж до речі досить ускладнює написання ваших міфічних "unit tests". Там багато чого не вистачає, окрім того, щоб взагалі піднімати питання про UT

А чому міфічних? І чому моїх? Unit tests не є моїми і тим більше не є міфічними :)
Так багато чого не вистачає. Але якщо розглядати код із сторони "тестування" можна буде простіше розробити кращий код (Моя думка)

Отже, за Вашою логікою, функціональний код взагалі не тестується? А отже кожен, хто такий підхід використовує, апріорі має поганий код [такий, що не можливо оцінити?], чи що?

Ні) Я старався донести наступну думку - необхідно тестувати код. Я б зробив об'єкт і його перевіряв. Ви б зробили по іншому.
Висловив свою думку: якщо будуть об'єкти контроллера - буде простіше розробляти. Це моя думка.

15

(16 відповідей, залишених у PHP)

Не зрозумів як перевірка (що б це не було) пов'язана з існуванням контролера

 
Тема низвається: Будь ласка , оцініть якість коду.
Для мене якість коду це можливість перевірити його на помилки. Можливість протестувати свій код. Відповідно для того що б його було зручно тестувати треба мати обєкт (в даному випадку це контроллер) Можете називати це як хочете,: контроллер, екшин або будь що інше. Я не побачив як можна написати unit test для цієї штуки. Відповідно і написав що я код не гуд. ;)

16

(1 відповідей, залишених у PHP)

BronzChef2056 напишіть у приват ;)

17

(16 відповідей, залишених у PHP)

@iovchynnikov можете пояснити запитання?

18

(0 відповідей, залишених у PHP)

Всім привіт. Розкажіть хто користується плагіном Php Inspections EA і чим він хороший(або поганий)

https://plugins.jetbrains.com/plugin/76 … -extended-

19

(16 відповідей, залишених у PHP)

2017й рік надворі - який mysql_* , люди?
юзайте mysqli_* !!!
навіть я перейшов цього року :D

Юзайте PDO навіть я перейшов )))

Тепер по якості коду:
Я буду оцінювати відносно свого рівня.
1.  Немає обєкту контроллера. Як ти будеш перевіряти свій код?
2. Використовуються глобальні змінні типу POST & SESSION. Як ти будеш тестувати свій код?
3. defined('_INCLUDE_') or die('Shit happens!');  Щось не так у твоїй архітектурі.
4. Sql injection. Якщо твій код десь уже працює - його можна поламати на раз два. $user_data = mysql_query("SELECT id, nickname, password, user_group, verified FROM users WHERE email='$user_email'")

В загальному на початок прийде. До речі якщо ти користуєшся phpstorm постав собі плагін Php Inspection EA https://plugins.jetbrains.com/plugin/76 … -extended-
Прожени інспецікї по проекту і він тобі підскаже що не так у твоєму коді)

20

(13 відповідей, залишених у PHP)

https://github.com/xparse/ElementFinder#usage  - тут є приклад - як вибрати з тегу title =)