因此,在java项目的Application ( main )类的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());
}
}在使用单例类(处理器):后更改代码
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();
}
}单例类(处理器)代码:
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());
}
}发布于 2018-09-25 07:16:50
很难判断您的设计,因为尚不清楚您的应用程序将如何更改,特别是您发布的代码是在欢迎更改的应用程序(main方法)的根目录中编写的。
为了提出更好的设计,我想:
XXXInfo的方式将被改变,例如它们可以从SQL数据库、网络中加载和处理。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();
}
}https://stackoverflow.com/questions/52487106
复制相似问题