Форум программистов, компьютерный форум, киберфорум
Наши страницы
Комментарии
Войти
Регистрация
Восстановить пароль
  1. Старый комментарий
    Аватар для HighPredator
    Трюк с try ... catch
    И рантайм исключения здесь не надо использовать. Максимум в моем примере эррор на него заменить.
    Запись от HighPredator размещена 03.02.2017 в 10:50 HighPredator вне форума
  2. Старый комментарий
    Аватар для HighPredator
    Трюк с try ... catch
    В принципе концепция верная. Но ответственности я бы разделил посильнее. Это упростит читабельность и как следствие модификацию и поддержку. Наподобие:
    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    {
            LoginParameters parameters;
     
            try {
                parameters = LoginParameters.newBuilder()
                        .withEmail(getTextContentFromEditById(R.id.login_edittext_email))
                        .withLogin(getTextContentFromEditById(R.id.login_edittext_login))
                        .withPassword(getTextContentFromEditById(R.id.login_edittext_password))
                        .build();
     
                account.login(parameters);
            } catch (UserInterfaceException e) {
                LOG.error(e, e);
            } catch (RequiredParameterMissingException e) {
                // handle exception
            }
        }
     
        public static String getTextContentFromEditById(final int id) throws UserInterfaceException {
            String content = null;
     
            EditText editText = (EditText) findViewById(id);
     
            if (editText != null) {
                Editable editable = editText.getText();
     
                if (editable != null) {
                    content = editText.toString();
                } else {
                    throw new UserInterfaceError("Editable for view is misconfigured");
                }
            } else
                throw new UserInterfaceException("View not found with id = " + id);
     
            return content;
        }
    }
    Java
    1
    2
    3
    4
    5
    
    public class UserInterfaceException extends Exception {
        public UserInterfaceException(String message) {
            super(message);
        }
    }
    Java
    1
    2
    3
    4
    5
    
    public class UserInterfaceError extends Error {
        public UserInterfaceError(String message) {
            super(message);
        }
    }
    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    public class RequiredParameterMissingException extends Exception {
        public RequiredParameterMissingException(String message) {
            super(message);
        }
     
        public RequiredParameterMissingException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    
    public class LoginParameters {
        private String email;
        private String login;
        private String password;
     
        private LoginParameters(String email, String login, String password) {
            this.email = email;
            this.login = login;
            this.password = password;
        }
     
        public static Builder newBuilder() {
            return new Builder();
        }
     
        public String getEmail() {
            return email;
        }
     
        public String getLogin() {
            return login;
        }
     
        public String getPassword() {
            return password;
        }
     
        public static final class Builder {
            private Optional<String> email;
            private Optional<String> login;
            private Optional<String> password;
     
            private Builder() {
                this.email = Optional.absent();
                this.login = Optional.absent();
                this.password = Optional.absent();
            }
     
            private boolean isFieldValid(final String field) {
                return true;
            }
     
            private void validatePassword() throws RequiredParameterMissingException {
                if (!password.isPresent())
                    throw new RequiredParameterMissingException("Password is missing");
                else if (!isFieldValid(password.get()))
                    throw new RequiredParameterMissingException("Invalid password");
            }
     
            private void validateLogin() throws RequiredParameterMissingException {
                if (!login.isPresent())
                    throw new RequiredParameterMissingException("Login is missing");
                else if (!isFieldValid(login.get()))
                    throw new RequiredParameterMissingException("Invalid login");
            }
     
            private void validateEmail() throws RequiredParameterMissingException {
                if (!email.isPresent())
                    throw new RequiredParameterMissingException("E-mail is missing");
                else if (!isFieldValid(email.get()))
                    throw new RequiredParameterMissingException("Invalid e-mail");
            }
     
            public Builder withEmail(final String email) {
                this.email = Optional.fromNullable(email);
                return this;
            }
     
            public Builder withLogin(final String login) {
                this.login = Optional.fromNullable(login);
                return this;
            }
     
            public Builder withPassword(final String password) {
                this.password = Optional.fromNullable(password);
                return this;
            }
     
            public LoginParameters build() throws RequiredParameterMissingException {
                validateEmail();
     
                validateLogin();
     
                validatePassword();
     
                return new LoginParameters(email.get(), login.get(), password.get());
            }
        }
    }
    Сделал схематично, но приведенное легко масштабируется на произвольное число исключений по части вадидации.
    Запись от HighPredator размещена 03.02.2017 в 10:34 HighPredator вне форума
  3. Старый комментарий
    Аватар для Avazart
    Трюк с try ... catch
    1. Стоит выбирать что использовать коды возврата или исключения в зависимости от ситуации от того что более уместно, в разных ситуация есть свои +/- в использовании того или иного подхода. В большинстве в случае выбирать ибо подход диктуется используемыми фреймворками, библиотеками.

    Обычно исключения очень неудобны когда способы обработки разных ситуаций сильно разнятся.
    Например каким будет код если логика предполагает что если поля пустые - нужно использовать данные "аккаунта по умолчанию" ?

    Что если полей будет не 2 а 20 ? Каким будет код ? Он будет из соплей try... catch Ex1 ... catch Ex2 ... catch Ex20
    Логично что если возможно стоило свести все к одному классу исключений и обрбатывать их одинаковым образом, а не так как у вас вкоде.

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    
    catch (PdfFileNotOpenedException)
    {
           MessageBox.Show("Pdf файл не выбран", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (AdobeReaderPathNullException)
    {
           MessageBox.Show("Не указан путь к AdobeReader", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    Явное дублирование кода, а можно было обойтись одним классом исключения.
    C#
    1
    2
    3
    4
    5
    6
    7
    8
    
          if ((email.isEmpty()) || (pass.isEmpty()))
           {
                    throw new FieldNotValidlException("Pdf файл не выбран");
           }
           else if (!Utils.isValidEmail(email))
           {
                    throw new FieldNotValidlException("Не указан путь к AdobeReader");
           }
    C#
    1
    2
    3
    4
    5
    6
    
    //...
    catch (FieldNotValidlException e)
    {
           MessageBox.Show(e.ErrorMessage, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    ]
    Как по мне порождать еще два лишних класса исключений(которые кстати никак не показаны в коде), что бы обработать "пустые" поля это слишком.
    Понятно что это лишь пример, но на нем видно что это излишне.
    Я понимаю использование своих исключений, когда пишеш свою бибилотеку классов.

    2. Стоит четко представлять с какой целью и какие случаи вы обрабатываете (или не обрабатываете) в каких ситуациях.

    Цитата:
    а вот делать различные проверки на ошибки в ходе выполнения программы очень и очень скучно и не охото.
    Не стоит пытаться обработать все и вся.

    Например можно:
    1. Обрабатывать исключение с цель его подавления (заглушка.)
    2. С целью перевода ошибки с интернацианализации или выдачи более понятной ошибки пользователю.
    3. С цель преоразования и "перекидывания" исключения на более высокий уровень...
    итд...

    3. Не стоит путать ошибки с исключениями. Исключения более широкое понятие.
    Запись от Avazart размещена 01.02.2017 в 20:02 Avazart вне форума
    Обновил(-а) Avazart 01.02.2017 в 20:28
  4. Старый комментарий
    Аватар для Avazart
    Трюк с try ... catch
    Цитата:
    В таком случае программисту не сразу ясно, что someFunction может прерваться.
    Она не может прерваться.

    Цитата:
    И ещё основная логика программы у вас переплелась с логикой обработки ошибок, а это большой минус.
    Я не понял утверждения.Говорите конкретнее. Где тут "логика программы" и где обработка ошибок. Как помне тут весь код обработка ошибок.
    Или точнее сказать валидация данных из GUI.

    Вы не владеете терминами и пытаетесь еще кого-то учить.

    Цитата:
    К тому же как в юнит тестах вы будете смотреть при каких условиях какая ошибка произошла?
    Чепуха.... Юнит тестах для GUI?
    Запись от Avazart размещена 01.02.2017 в 19:43 Avazart вне форума
    Обновил(-а) Avazart 01.02.2017 в 19:52
  5. Старый комментарий
    Аватар для Nikto
    Трюк с try ... catch
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    bool сheckField(EditText text,String msg)
    {
      if(email.isEmpty())
      {
         Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
         return false;
      } 
      return true;
    }
     
     
    void someFunction()
    {
     
        String email = ((EditText)findViewById(R.id.login_edittext_email)).getText().toString();
        if(!сheckField(email,"Не введён логин"))
           return;
     
     
        String pass = ((EditText)findViewById(R.id.login_edittext_pass)).getText().toString();
        if(!сheckField(password,"Не введён пароль"))
             return;
    // ...  
    }
    В таком случае программисту не сразу ясно, что someFunction может прерваться. В то время как блоки try catch говорят сами о себе, что try может прерваться в любой момент.
    К тому же как в юнит тестах вы будете смотреть при каких условиях какая ошибка произошла?
    И ещё основная логика программы у вас переплелась с логикой обработки ошибок, а это большой минус.
    Запись от Nikto размещена 01.02.2017 в 18:35 Nikto вне форума
  6. Старый комментарий
    Аватар для Avazart
    Трюк с try ... catch
    Цитата:
    Представьте если мы не будем использовать try catch,
    Код будет короче и проще?

    Цитата:
    В таком случае код стал менее читаемым.
    Я так не думаю. По крайней мере если писать последовательно а не так как вы переплели код.
    Т.е код можно написать лучше чем вы это сделали соответственно о будет выглядеть не хуже чем с исключениями, а то и куда лучше.

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    bool сheckField(EditText text,String msg)
    {
      if(email.isEmpty())
      {
         Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
         return false;
      } 
      return true;
    }
     
     
    void someFunction()
    {
     
        String email = ((EditText)findViewById(R.id.login_edittext_email)).getText().toString();
        if(!сheckField(email,"Не введён логин"))
           return;
     
     
        String pass = ((EditText)findViewById(R.id.login_edittext_pass)).getText().toString();
        if(!сheckField(password,"Не введён пароль"))
             return;
    // ...  
    }
    Запись от Avazart размещена 01.02.2017 в 13:40 Avazart вне форума
    Обновил(-а) Avazart 01.02.2017 в 15:34
  7. Старый комментарий
    Аватар для Nikto
    Трюк с try ... catch
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Мне как человеку который пишет кода в основном на С++ интересно, откуда вылезли эти правила?
    Т.е в чем польза/суть?


    И откуда новый термин "классы ошибок" ....
    Я обобщил и постарался достаточно просто изложить то, о чём пишет Роберт Мартин в книге "Чистый Код" про try catch.

    Польза в том, что код перестаёт вевтиться, и увеличивается наглядность кода. Представьте если мы не будем использовать try catch, а вместо них просто ифы. Получится нечто вроде:
    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    boolean isErrors = false;
    String email = ((EditText)findViewById(R.id.login_edittext_email)).getText().toString();
    String pass = ((EditText)findViewById(R.id.login_edittext_pass)).getText().toString();
     
    if ((email.isEmpty()) || (pass.isEmpty()))
    {
        Toast.makeText(getApplicationContext(), "Не введён логин или пароль", Toast.LENGTH_SHORT).show();
        isErrors = true;
    }
    else if (!Utils.isValidEmail(email))
    {
        Toast.makeText(getApplicationContext(), "Некорреткный email адрес", Toast.LENGTH_SHORT).show();
        isErrors = true;
    }
     
    if (!isErrors)
    {
        ...//создаём параметры для входа
        account.login(params);
    }
    В таком случае код стал менее читаемым. Обработка ошибок не путается с основным кодом. Я считаю, что код с try catch выглядит гораздо лучше, легче пишется и этим гораздо эффективней.
    Запись от Nikto размещена 01.02.2017 в 00:46 Nikto вне форума
    Обновил(-а) Nikto 01.02.2017 в 00:47
  8. Старый комментарий
    Аватар для ProCode
    Трюк с try ... catch
    Пишу на php но трай-кэтч действительно использую оч редко. Разве что для соединения с БД.

    Присмотрюсь внимательней к этой конструкции. Спасиб
    Запись от ProCode размещена 01.02.2017 в 00:32 ProCode вне форума
  9. Старый комментарий
    Аватар для Avazart
    Трюк с try ... catch
    Цитата:
    Нужно знать всего несколько правил:
    1) не используйте в основном коде ифы (if) для проверки на ошибки в ходе выполнения;
    2) не используйте коды ошибок, вместо них используйте классы ошибок (например в c# собственные классы ошибок наследуйте от Exception, в java от RuntimeException);
    3) при проверке на ошибки используйте блоки try ... catch.
    Мне как человеку который пишет кода в основном на С++ интересно, откуда вылезли эти правила?
    Т.е в чем польза/суть?

    Цитата:
    вместо них используйте классы ошибок (например в c# собственные классы ошибок наследуйте от Exception, в java от RuntimeException);
    И откуда новый термин "классы ошибок" ....
    Запись от Avazart размещена 01.02.2017 в 00:15 Avazart вне форума
    Обновил(-а) Avazart 01.02.2017 в 00:17
  10. Старый комментарий
    Аватар для Nikto
    Нажимаем кнопочки в окнах средствами WinApi
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Я лично не знаю, у меня очень маленький опыт работы с С#, но читайте sau:

    Я обратил на это внимание по тому как мне тоже интересно как оно работает.
    Попробовал код из темы, очень хорошо работает, с многих окон тянет текст, но из opengl приложения ни с одного элемента не может вытянуть.
    Запись от Nikto размещена 06.01.2017 в 13:53 Nikto вне форума
  11. Старый комментарий
    Аватар для Avazart
    Нажимаем кнопочки в окнах средствами WinApi
    Я лично не знаю, у меня очень маленький опыт работы с С#, но читайте sau:
    Цитата:
    Сообщение от sau Посмотреть сообщение
    UI Automation не использует hwnd напрямую , информацию по UI предоставляет соответствующий провайдер , так оно легко справляется с WPF приложениями , где тоже чистая графика.
    Я обратил на это внимание по тому как мне тоже интересно как оно работает.
    Запись от Avazart размещена 04.01.2017 в 21:06 Avazart вне форума
  12. Старый комментарий
    Аватар для Nikto
    Нажимаем кнопочки в окнах средствами WinApi
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Правильно ли я понимаю, что ничего не выйдет, если элемент отрисован не через WinAPI, а например через OpenGL?
    Запись от Nikto размещена 04.01.2017 в 13:28 Nikto вне форума
  13. Старый комментарий
    Запись от Avazart размещена 03.01.2017 в 22:29 Avazart вне форума
    Обновил(-а) Avazart 03.01.2017 в 22:31
  14. Старый комментарий
    Аватар для Nikto
    Если до сих пор подгорает от нового вк...
    Обновил стили в посте, теперь превращает гораздо больше кругов в квадраты чем раньше. Если удастся заметить что-нибудь ещё, то внесу ещё исправления.
    Запись от Nikto размещена 13.09.2016 в 18:46 Nikto вне форума
  15. Старый комментарий
    Если до сих пор подгорает от нового вк...
    [QUOTE=Denzel1104;bt15380]Вы сейчас сравниваете новый дизайн, с человеком, которого недолюбливаете[/QUOTE]
    Дизайны с человеком не сравниваю. Читай внимательнеее.
    [QUOTE=Denzel1104;bt15380]ваше мнение в этом случае может быть предвзято[/QUOTE]
    А может и не быть. У консерваторов оно тоже предвзятое, они привыкли к чему-то, корнями приросли как бабульки к лавочке.
    [QUOTE=Denzel1104;bt15380]визуальный мусор, сокращение размера ленты и серый цвет фона могут сделать новый дизайн лучше, да и наличие дополнительных пустых пространств намекает о некой ограниченности.[/QUOTE]
    Все, что не помогает, можно считать "визуальным мусором". Например, аватарки на форуме. Или иконки слева в блоке "опции". Серый цвет смотрится офигенно, теперь видны границы блоков, а не сливается все в одну кашу. И особенно удобнее в темноте. У facebook тоже бэкграунд темнее, блоки белые. Тоже шапка наверху широкая. А дизайнеры фейсбука лучше знают, могут, и понимают, чем форумные недодизайнеры и Дуров :D Они, так сказать, оригинаторы всего этого.
    Это не интернет-газета, сокращение размера ленты в разумных пределах поддерживаю. Компактность - это хорошо.
    Это не пустые пространства - это группировка и организация. Офигенно органично и круто смотрится.
    Нафиг еще поддерживать одновременно два стиля. Пусть вкладываются в один. Те, кто хочет два - пусть свои css пилит.
    Запись от nimazzzy размещена 25.08.2016 в 12:29 nimazzzy вне форума
  16. Старый комментарий
    Если до сих пор подгорает от нового вк...
    Цитата:
    Сообщение от nimazzzy Просмотреть комментарий
    Ух ты. Я уже писал. Какую ценность представляет точка зрения о дизайне человека, который сам скопировал чужой дизайн? Объективно - ценность его мнения = ценности мнения случайного соседа Ивана, так как ни тот, ни другой, ничего своего не задизайнили.
    Вы сейчас сравниваете новый дизайн, с человеком, которого недолюбливаете, и ваше мнение в этом случае может быть предвзято. Вполне возможно, что элементы фэйсбука могли быть украдены, но юзабельности это не отменяет. Лично мне не понятно, как визуальный мусор, сокращение размера ленты и серый цвет фона могут сделать новый дизайн лучше, да и наличие дополнительных пустых пространств намекает о некой ограниченности. Я не говорю, что у нового дизайна нет новых хороших фишек, они несомненно есть и местами очень удобны, но проще было бы внести их в дополнение к старому или оставить юзерам возможность закрепить за собой старый дизайн, если нравится. Иными словами возможность выбора дизайна не создавала бы таких проблем, из-за которых проходят вот такие конфликтные беседы, как у нас.
    Запись от Denzel1104 размещена 25.08.2016 в 12:01 Denzel1104 вне форума
  17. Старый комментарий
    Если до сих пор подгорает от нового вк...
    [QUOTE=Nikto;bt15378]Скажите, почему мнение Дурова, на ваш взгляд, не стоит брать во внимание?[/QUOTE]
    Ух ты. Я уже писал. Какую ценность представляет точка зрения о дизайне человека, который сам скопировал чужой дизайн? Объективно - ценность его мнения = ценности мнения случайного соседа Ивана, так как ни тот, ни другой, ничего своего не задизайнили.
    Запись от nimazzzy размещена 25.08.2016 в 11:31 nimazzzy вне форума
    Обновил(-а) nimazzzy 25.08.2016 в 11:32
  18. Старый комментарий
    Аватар для Nikto
    Если до сих пор подгорает от нового вк...
    Цитата:
    Сообщение от nimazzzy Просмотреть комментарий
    Сколько эмоций от какой-то там социальной сеточки. Пфффф... От Паши всякую фигню неудивительно слышать. Не вижу причин, почему его мнение должно что-то значить, когда дизайн вк был слизан со стаааарого дизайна фейсбука. Его мнение нельзя считать хоть сколько-нибудь ценным. Проблемы нового дизайна? У меня проблем нет.
    Скажите, почему мнение Дурова, на ваш взгляд, не стоит брать во внимание?
    Запись от Nikto размещена 25.08.2016 в 11:19 Nikto вне форума
  19. Старый комментарий
    Если до сих пор подгорает от нового вк...
    Как реклама зависит от дизайна? Меня мусор в новостях задолбал еще в классике :D вся реклама осталась на месте.
    Запись от nimazzzy размещена 25.08.2016 в 08:41 nimazzzy вне форума
  20. Старый комментарий
    Если до сих пор подгорает от нового вк...
    Цитата:
    Проблемы нового дизайна?
    Я уже высказался.
    Цитата:
    ВК стал превращаться в одноклассники, которые задолбают юзвера всякой чушью в интерфейсе и мусором в новостной ленте.
    Запись от HelicopterK52 размещена 25.08.2016 в 00:44 HelicopterK52 вне форума
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru