Кофе-брейк #172. Как написать на Java калькулятор доходности

Статья из группы Random
Источник: Medium В этой статье изложено практическое руководство по написанию на языке Java калькулятора доходности. Кофе-брейк #172. Как написать на Java калькулятор доходности - 1Программа, о которой сегодня пойдет речь, — это простой калькулятор доходности с возможностью добавления дополнительных функций и, возможно, интерфейса, созданного с помощью Java Swing. Программа может рассчитать два показателя доходности — валовый доход и прибыль. В Java каждая программа начинается с класса. Для нас это своего рода чертеж, например, автомобиля марки Toyota. Но если про класс мы можем думать как о чертеже, то Toyota у нас будет объектом класса. Еще одну аналогию можно применить к обуви и ботинкам. Здесь обувь можно рассматривать как класс или чертеж предметов/материалов, используемых для защиты наших ног. А поскольку ботинки — это тип обуви, то они у нас являются объектом класса. Это основы программирования на Java и всего объектно-ориентированного программирования. Итак у нас есть Main.java — класс, содержащий метод main. Методы можно представить как функции или фрагменты кода, которые способны что-то выполнять. Вот пример класса Main в нашей будущей программе:

class Main {
  public static void main(String[] args) {
    Profitability profitability = new Profitability();
    System.out.println(profitability.getRevenue());
    System.out.println(profitability.getCost());
    System.out.println(profitability.grossProfit());
    System.out.println(profitability.profitMargin());
  }
}
Мы должны помнить, что каждая программа на языке Java должна иметь метод main, то есть метод, который будет выполняться в Java. Как можно заметить, метод main имеет ряд различных ключевых слов — идентификаторов и модификаторов, которые дополнительно его определяют. Давайте вкратце раскроем их. Ключевое слово public сообщает Java, что этот метод доступен за пределами файла Main.java. Ключевое слово static сообщает Java, что метод доступен только для экземпляра класса, а не для объектов. Ключевое слово void сообщает Java, что этот метод ничего не возвращает. В теле метода main есть ряд выражений и методов, но прежде чем мы углубимся в них, давайте посмотрим, что находится внутри файла Profitability.java.

import java.util.Scanner;
class Profitability {
public int revenue, cost;
public int getRevenue() {
    Scanner revenueScanner = new Scanner(System.in);
    System.out.println("What is your revenue or total sales?");
    revenue = Integer.parseInt(revenueScanner.nextLine());
    return revenue;
  }
public int getCost() {
    Scanner costScanner = new Scanner(System.in);
    System.out.println("What is your Total Cost? ");
    cost = Integer.parseInt(costScanner.nextLine());
    return cost;
  }
public int grossProfit() {
    return revenue - cost;
  }
public double profitMargin( ){
    return (((double) grossProfit() / (double) revenue));
  }
Язык Java в мире программирования известен тем, что имеет большое количество API. В первой строке мы говорим Java импортировать класс из пакета java.util — это класс Scanner. Класс Scanner имеет множество методов, но нас больше всего интересует возможность захвата пользовательского ввода. Это будет интерфейс, с которым пользователь будет взаимодействовать в командной строке. Во второй строке мы создаем класс Profitability. Затем мы объявляем две важные переменные, которые потребуются от пользователя — cost (стоимость) и revenue (выручка, валовый доход). Мы объявляем их общедоступными, чтобы каждый метод мог иметь к ним доступ. Нам нужно, чтобы они были примитивного типа int. Затем я создаю метод getRevenue(). В нем то, что я хочу зафиксировать, — это валовый доход компании пользователя. Этот доход можно приблизительно определить как общее количество продаж или, с экономической точки зрения, общее количество товара, умноженное на его цену.
tr = p*q
где:
  • tr = total revenue
  • p = price
  • q = quantity
Внутри метода я создаю объект из класса Scanner, импортированного в строке 1, а затем использую метод System.out.println() для показа пользователю нового направления — ввода значения выручки. Затем я записываю это значение в уже объявленную, но пустую переменную revenue. А сейчас на этом этапе нам необходимо сделать паузу. Ввод значения выручки, хотя и может быть числом, здесь фиксируется как String (непримитивный тип в Java), который является объектом. Если мы хотим, чтобы значение выручки было целым числом, посмотрите на предыдущую строку:

public int cost,revenue;
В строке, показанной выше, мы объявили revenue (выручка, валовый доход) как целое число, потому что эта переменная всегда выражается числовым значением. Таким образом, если нам нужно преобразовать эту переменную из строки в целое число, то эта операция называется преобразованием типов (Type Casting). В Java есть и другие формы преобразования типов: расширение (Widening) и сужение (Narrowing), но эти формы существуют среди примитивных типов — int, byte, short, long, char, boolean, double, float. А так как String — это непримитивный тип, для него есть отдельная строка:

revenue = Integer.parseInt(revenueScanner.nextLine());
nextLine() — это метод класса Scanner, он захватывает строки. В этом классе есть другие методы для захвата других типов переменных, таких как nextInt(), nextByte(), nextBoolean() и так далее. Вы можете изучить документацию по Java API на сайте Oracle, чтобы просмотреть и сослаться на полный список методов в этом классе. Затем последняя строка просто говорит Java вернуть целое число выручки. В методе getCost() код аналогичен описанному выше методу getRevenue(). Он включает в себя получение общей стоимости (Total Cost) от пользователя за определенный период времени. Здесь используется класс Scanner для сохранения этого ввода в переменную cost (стоимость):

public int getCost() {
    Scanner costScanner = new Scanner(System.in);
    System.out.println("What is your Total Cost? ");
    cost = Integer.parseInt(costScanner.nextLine());
    return cost;
  }
Также у нас есть метод GrossProfit(). Этот метод просто вычисляет разницу между выручкой и стоимостью, и возвращает этот показатель. Обратите внимание, что метод имеет возвращаемый тип — int.

public int grossProfit() {
    return revenue - cost;
  }
И, наконец, у нас есть метод profitMargin(); этот метод был немного сложным, поскольку маржа прибыли рассчитывается как выручка после вычета стоимости товара и всех остальных затрат. Так как это будет процент, profitMargin() должен вернуть двойное значение или число с плавающей запятой (в зависимости от степени точности, которую мы ищем после). Метод GrossProfit() возвращает целое число, и метод getRevenue() также возвращает целое число, даже если переменная revenue была объявлена ​​ранее как целое число. Этот процесс зависимости типов, взаимосвязей и согласованности — вот что делает Java языком статических типов или, как его называют некоторые, типобезопасным языком, в отличие от других языков, таких как Python, которые имеют динамическую типизацию. Эта особенность языка Java помогает предотвратить ошибки в долгосрочной перспективе, тем самым снижая затраты на обслуживание и технический долг. Решение этой проблемы состоит в том, чтобы преобразовать и переменную GrossProfit(), и переменную revenue как double, поскольку нас интересует процентное или десятичное значение (1.226, 6.5, 200.345), а не значение в целых числах (2, 3, 45, 600):

public double profitMargin( ){
    return (((double) grossProfit() / (double) revenue));
  }
Это конец программы, мы закончили писать код для расчета общей прибыли, а также маржи прибыли, имея всего два значения — выручку (revenue) и стоимость (cost). Позже мы сможем расширить эту программу, добавив дополнительные показатели, которые можно извлечь из введенных пользователем данных. В файле Main.java у нас есть метод main(). Помните, что этот метод запускает Java, и каждая программа Java должна иметь метод main(). В методе main мы должны создать объект нашего класса Profitability:

Profitability profitability = new Profitability();
Этот экземпляр объекта предоставляет методу main доступ ко всем общедоступным атрибутам (переменным) и методам в файле Profitability.java. После этого все становится простым упражнением по копированию и вставке различных методов. Нам нужно лишь сначала получить от пользователя показатели выручки и стоимости, чтобы затем рассчитать общую прибыль и маржу прибыли. Эти два метода нуждаются в этих переменных. Иначе мы увидим сообщение об ошибке.

System.out.println(profitability.getRevenue()); 
System.out.println(profitability.getCost()); 
System.out.println(profitability.grossProfit()); 
System.out.println(profitability.profitMargin());
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Эд Кукса Уровень 28
2 ноября 2022
В Profitability отсутствует закрывающая скобка. Вместо nextLine() можно было сразу использовать nextInt() без приведения типов, причём метод ниже по тексту упоминается. Ну и в возвращаемом выражении profitMargin лишний раз скобки дублируются. Причём в оригинале статьи ровно эти же недочёты.