JavaRush/Java блог/Архив info.javarush/Достойный и красивый код
Javin
7 уровень

Достойный и красивый код

Статья из группы Архив info.javarush
участников
Раздел с примерами как не следует писать программный код есть, так может следует иметь тему на форуме и с диаметрально противоположными примерами? Догадываюсь, что понятия «достойно и красиво» весьма субъективны, ну так дружелюбно и без насмешек ведь вполне можно обходиться с коллегами по изучению java-премудростей, не так ли, друзья?! Идея родилась вчера, когда в комментариях к заданиям в новой версии javarush обнаружил для себя два познавательных и изящных кода (жаль, что авторам в тех разделах нельзя было «плюсануть» - создатели javarush эту возможность не предоставили). А если взять примеры из изобразительного искусства, музыки, литературы, то обучение строится на достойных примерах для подражания. Не встречалось что-то обучение мастерству на примерах китча, безвкусицы, пошлости. Даже в строгой шахматной аннотации используется восклицательный знак, когда следует неочевидный и весьма эффектный ход… В общем, я за подборку достойных и красивых примеров для подражания и в java-программировании. P.S. Созвучная некоторым изложенным мыслям статья: «Что такое красивый код, и как его писать?»
Комментарии (3)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Javin
Уровень 7
9 марта 2017, 14:13
Использование массива типа char
Автор: Ruslan Zinovyev
Задание: Ввести с клавиатуры число. Определить, сколько в введенном числе четных цифр, а сколько нечетных.
Если число делится без остатка на 2 (т. е. остаток равен нулю), значит оно четное.
Увеличиваем на 1 счетчик четных цифр (статическая переменная even).
Иначе число нечетное, увеличиваем счетчик нечетных цифр (статическая переменная odd).
Вывести на экран сообщение: «Even: а Odd: b», где а — количество четных цифр, b — количество нечетных цифр.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
   public static int even = 0;
   public static int odd = 0;

   public static void main(String[] args) throws IOException {
           BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
           String s = reader.readLine();
           char[] array = s.toCharArray();

           for (char x : array ) {

               if(x % 2 == 0) {
                   even++;
               } else {
                   odd++;
               }
           }
           System.out.println("Even: " + even + " Odd: " + odd);
       }
}

Тип char в Java используется для хранения Unicode-символов, однако решение предложенное Ruslan Zinovyev напоминает, что его можно использовать и как целочисленный тип [0;65 536]. А зная, что юникод цифровых символов от 0 до 9 в шестнадцатеричной записи: 0030 до 0039, то и для разделения на четные-нечетные цифры он вполне подходит.
Joysi
Уровень 41
9 марта 2017, 15:22
Усовершенствовать можно и дальше:
А зная, что юникод цифровых символов от 0 до 9 в шестнадцатеричной записи: 0030 до 0039
то есть в десятичной записи от 48 до 57.
Шаг 1. Вычитая 48 мы собственно и получим числа от 0 до 9.
Шаг 2. Числа от 0 до 9 в двоичной форме (раз уже в курсе про шестнадцатеричное представление чисел) записываются в виде:
0000 = 0
0001 = 1
0010 = 2
1001 = 9
Как видно у всех нечетных чисел младший бит всегда = 1. Используем это:

public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        char[] array = reader.readLine().toCharArray();
        int odd = 0;
        for(char digit:array)
            odd += (digit-48) & 1; // Оставляем только младший бит числа
        System.out.println("Even:" + (array.length-odd) + " odd: " +odd);
    }

а можно и заранее сопоставить каждой цифре признак нечетности (1) или четности(0):
public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] evenOdd = {0,1,0,1,0,1,0,1,0,1}; // 0 - четное, 1 - нечетное
        char[] array = reader.readLine().toCharArray();
        int odd = 0;
        for(char digit:array)
            odd += evenOdd[digit-48];
        System.out.println("Even:" + (array.length-odd) + " odd: " +odd);
    }
Joysi
Уровень 41
9 марта 2017, 13:34
А если взять примеры из изобразительного искусства, музыки, литературы, то обучение строится на достойных примерах для подражания…
Искусство — слишком индивидуально и зависит от массы других факторов (время, социум,..._).
У Сергея Рахманинова солдаты в окно рояль выбросили, что не мешало восхищаться его музыкой в СССР спустя 20 лет.

По поводу красивого и достойного кода после второй половины (я про старую версию, в районе 30 уровня) — будут занятия и практика посвященные правильному оформлению кода (с точки зрения читаемости) и также рефакторингу (оптимизация с точки зрения повторного использования, ресурсовыделения и т.п.).

Если уже любопытно, можете посмотреть материалы на
refactoring.guru/
google.github.io/styleguide/javaguide.html
web.archive.org/web/20140228225807/http://www.oracle.com/technetwork/java/codeconventions-150003.pdf