Проблемы в рефакторинге кода / выяснении шаблона проектирования для использования - PullRequest
0 голосов
/ 24 сентября 2018

Итак, у меня было довольно много строк кода для выполнения в методе main класса Application (Main) java-проекта.Чтобы избавиться от всего этого беспорядка, я в итоге реорганизовал его, используя технику рефакторинга метода extract, но затем у меня появилось много статических методов в классе Main, которые я не фанат .... Что было бы лучшеспособ получить чистый основной метод применения?Должен ли я использовать одноэлементный класс, возможно? Какие еще шаблоны / методики проектирования я должен использовать, чтобы избежать использования всех этих статических методов в моем основном классе и сохранять основной метод как можно более кратким?

Исходный код:

import controller.Statistics;
import model.primary.customer.CustomerInfo;
import model.primary.movie.MovieInfo;
import model.primary.rating.RatingInfo;
import util.FileParsing.FileParser;
import util.mapping.CustomerMapper;
import util.mapping.MovieMapper;
import util.mapping.RatingsMapper;
import view.DisplayStatistics;
import view.UserInterface;

public class Application {

    public static void main(String[] args) {
        Statistics statistics = processStatistics();
        DisplayStatistics displayStatistics = new DisplayStatistics(statistics);
        initiateUI(displayStatistics);
    }

    private static Statistics processStatistics() {
        MovieInfo movieInfo = processMovies();
        CustomerInfo customerInfo = processCustomers();
        RatingInfo ratingInfo = processRatings();

        return new Statistics(customerInfo, movieInfo, ratingInfo);
    }

    private static void initiateUI(DisplayStatistics displayStatistics) {
        UserInterface userInterface = new UserInterface(displayStatistics);
        userInterface.start();
    }

    private static RatingInfo processRatings() {
        FileParser ratingsFile = new FileParser("ratings.dat", "::");
        RatingsMapper ratingsMapper = new RatingsMapper(ratingsFile, 4);
        return new RatingInfo(ratingsMapper.getCustomerIDMovieIDRatingAndTimeMap());
    }

    private static CustomerInfo processCustomers() {
        FileParser customerFile = new FileParser("users.dat", "::");
        CustomerMapper customerMapper = new CustomerMapper(customerFile, 5);
        return new CustomerInfo(customerMapper.getIdCustomerMap());
    }

    private static MovieInfo processMovies() {
        FileParser movieFile = new FileParser("movies.dat", "::");
        MovieMapper movieMapper = new MovieMapper(movieFile, 3);
        return new MovieInfo(movieMapper.getIdMovieMap());
    }

}

Изменен код после использования класса Singleton (процессор):

import controller.Statistics;
import view.DisplayStatistics;
import view.UserInterface;

public class Application {

    public static void main(String[] args) {

        Statistics statistics = Processor.getInstance().processStatistics();

        DisplayStatistics displayStatistics = new DisplayStatistics(statistics);

        UserInterface userInterface = new UserInterface(displayStatistics);

        userInterface.start();
    }


}

Код класса Singleton (процессор):

import controller.Statistics;
import model.primary.customer.CustomerInfo;
import model.primary.movie.MovieInfo;
import model.primary.rating.RatingInfo;
import util.FileParsing.FileParser;
import util.mapping.CustomerMapper;
import util.mapping.MovieMapper;
import util.mapping.RatingsMapper;


public class Processor {
    private static Processor ourInstance = new Processor();

    public static Processor getInstance() {
        return ourInstance;
    }

    private Processor() {

    }

    static Statistics processStatistics() {

        MovieInfo movieInfo = processMovies();
        CustomerInfo customerInfo = processCustomers();
        RatingInfo ratingInfo = processRatings();

        return new Statistics(customerInfo, movieInfo, ratingInfo);
    }

    private static RatingInfo processRatings() {

        FileParser ratingsFile = new FileParser("ratings.dat", "::");
        RatingsMapper ratingsMapper = new RatingsMapper(ratingsFile, 4);
        return new RatingInfo(ratingsMapper.getCustomerIDMovieIDRatingAndTimeMap());
    }

    private static CustomerInfo processCustomers() {

        FileParser customerFile = new FileParser("users.dat", "::");
        CustomerMapper customerMapper = new CustomerMapper(customerFile, 5);
        return new CustomerInfo(customerMapper.getIdCustomerMap());
    }

    private static MovieInfo processMovies() {

        FileParser movieFile = new FileParser("movies.dat", "::");
        MovieMapper movieMapper = new MovieMapper(movieFile, 3);
        return new MovieInfo(movieMapper.getIdMovieMap());
    }
}

1 Ответ

0 голосов
/ 25 сентября 2018

Трудно судить о вашем дизайне, потому что неясно, как будет изменено ваше приложение, особенно ваш опубликованный код написан в корне приложения (main метод), где приветствуются изменения.

ВЧтобы предложить лучший дизайн, я предполагаю, что:

  1. Будет изменен способ создания XXXInfo, например, их можно загружать и обрабатывать из базы данных SQL, сети ...
  2. Создание Statistics, DisplayStatistics и UserInterface происходит где-то в вашем приложении, отличном от метода main, это означает, что вы можете захотеть повторно использовать это сочинение в другом коде.

Так вот код:

interface InfoLoader {
    RatingInfo loadRatingInfo();
    CustomerInfo loadCustomerInfo();
    MovieInfo loadMovieInfo();
}

class FileInfoLoader implements InfoLoader {
    public RatingInfo loadRatingInfo() {
        FileParser ratingsFile = new FileParser("ratings.dat", "::");
        RatingsMapper ratingsMapper = new RatingsMapper(ratingsFile, 4);
        return new RatingInfo(ratingsMapper.getCustomerIDMovieIDRatingAndTimeMap());
    }
    public CustomerInfo loadCustomerInfo () {
        FileParser customerFile = new FileParser("users.dat", "::");
        CustomerMapper customerMapper = new CustomerMapper(customerFile, 5);
        return new CustomerInfo(customerMapper.getIdCustomerMap());
    }
    public MovieInfo loadMovieInfo () {
        FileParser movieFile = new FileParser("movies.dat", "::");
        MovieMapper movieMapper = new MovieMapper(movieFile, 3);
        return new MovieInfo(movieMapper.getIdMovieMap());
    }
}

class App {
    public App(InfoLoader infoLoader) {
        this.infoLoader = infoLoader;
    }
    public void start() {
        Statistics stat = new Statistics(
            infoLoader.loadCustomerInfo(),
            infoLoader.loadMovieInfo(),
            infoLoader.loadRatingInfo()
        );
        DisplayStatistics ds = new DisplayStatistics(stat);
        UserInterface ui = new UserInterface(ds);
        ui.start();
    }
    private InfoLoader infoLoader;
}

public class Application {
    public static void main(String[] args) {
        InfoLoader infoLoader = new FileInfoLoader();
        // or InfoLoader infoLoader = new SqlInfoLoader();
        App app = new App(infoLoader);
        app.start();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...