首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构代码/计算要使用的设计模式中的问题

重构代码/计算要使用的设计模式中的问题
EN

Stack Overflow用户
提问于 2018-09-24 20:45:46
回答 1查看 70关注 0票数 0

因此,在java项目的Application ( main )类的Main方法中,我有很多行代码要执行。为了消除所有的杂乱,我最后用提取方法重构技术重构了它,但是在主类中我得到了很多静态方法,我不喜欢.有什么更好的方法来获得一个干净的主应用方法?我应该使用一个单例类吗?我应该使用什么其他的设计模式/技术来避免在我的主类中使用所有这些静态方法,并尽可能地保持主方法的简洁性?

初始代码:

代码语言:javascript
复制
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());
    }

}

在使用单例类(处理器):后更改代码

代码语言:javascript
复制
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();
    }


}

单例类(处理器)代码:

代码语言:javascript
复制
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());
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-25 07:16:50

很难判断您的设计,因为尚不清楚您的应用程序将如何更改,特别是您发布的代码是在欢迎更改的应用程序(main方法)的根目录中编写的。

为了提出更好的设计,我想:

  1. 创建XXXInfo的方式将被改变,例如它们可以从SQL数据库、网络中加载和处理。
  2. StatisticsDisplayStatisticsUserInterface的组合发生在应用程序中的某个地方,而不是main方法,这意味着您可能希望在另一个代码中重用这个组合。

下面是代码:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52487106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档