创建哪些类方法?

5
我正在寻找创建一个测试应用程序,可以检查航空公司提供的各种航班信息 我对类和方法的概念以及要创建哪些类和方法感到困惑。 我的当前思路如下: 数据是从网站下载的,由于数据量很大,我只想下载一次数据。 我目前的想法是:

BritishAirwaysFlightData()

构造函数
BritishAirwaysFlightData // Used to download the BA Flight database and store in the object (Assumging his is only small i.e. 500kb)

方法
getStartDate(String source_airport, String dest_airport) // Takes source and destination airport and return date when flights start
getEndDate(String source_airport, String dest_airport)   // Takes source and destination airport and return date when flights finish
getDestAirports(String source_airport)                   // Takes source airport name and returns a list of destinations
getSourceAirports(String dest_airport)                   // Takes source airport name and returns a list of sources
getNumofDestinations()                                   // Returns total number of destinations

希望你可以大致了解我试图实现的内容,但我不确定这是否是正确的方法。我会从Class中创建一个对象,构造函数将自动下载数据并存储在适当的对象数组中。

将创建一个主程序,允许用户查询航班信息等。

它将有效地从主程序查询此对象以查找有关航班、日期等的特定信息。

考虑到我不想直接访问数据,并且我带宽受限,需要实现某种本地缓存版本,这是否是实现此类功能的最佳方法?

我更关心类/构造函数/方法的实际组成,而不是每个方法和调用参数的实际功能。

希望这有意义,任何指针都将不胜感激,还有任何具有大量实际示例(如此类)的参考站点,可改善我对问题的初步分析。

谢谢,


我会创建一个“实体(Entity)”类来表示每个航班,然后创建一个“服务(Service)”类来下载数据并返回您的航班实体列表。然后,您可以将这些本地存储,可能使用像Hibernate这样的ORM存储到数据库中,或者仅将其转换为JSON或XML并将文件存储在本地。 - CodeChimp
1
将数据集命名为类是错误的。'FlightData' 是一个明智的选择。'FlightData.Airline' 是一个合理的嵌套枚举。(当然,'BritishAirways' 是枚举集合的成员。)'FlightData.Source' 或 'FlightDataSource'(以枚举作为输入)是一个合理的数据访问类。 - alphazero
你可以将工作分解。有一个进程定期从网站下载数据并将其转换为自己的本地数据存储,然后您的客户端进程连接并从该本地数据存储中读取。这样,您的客户端就不需要关心从外部系统下载了什么。当JVM进程重新启动时,您还可以维护数据的缓存。 - Charlie
3个回答

3
您提出的方法似乎更适合在一个“服务”中使用。
思路是这样的:您想要“分离您的关注点”。
一个关注点是对数据建模。这意味着创建一个容器来存储您的数据,并使用有意义的方法来操作数据。如果有必要,您可以创建一个基类FlightData和一个子类BritishAirwaysFlightData(如果数据不会因航空公司而改变,那么您只需要一个通用对象)。根据您的方法,为Airport和Flight也创建一个类可能是有意义的。
另一个关注点是获取数据。所以您可能需要一个仅与数据源交互的类。这些类通常称为数据访问对象(DAO)。
服务是另一个类,将使用数据访问类和数据模型类一起执行一个工作单元。
因此,请考虑方法getSourceAirports,我假设它的意思是“获取所有航班起点机场”。如果您拥有名为Flight的数据模型,则可以想象该类将具有departureAirport和arrivalAirport字段(以及其他字段)。要获取起始机场,您将从Flight表(对应于Flight类)中查询所有唯一的departureAirports在数据源中找到。

2
你提出的方法是可行的,但我不建议这样做,它的扩展性很差。我同意下载数据一次的概念,但这并不意味着你不能实现一个丰富的领域模型和一个合适的分层架构。
首先,我建议你为FlightData创建一个通用类:
public class FlightData {
    private FlightOperator operator;
    ...
}

这段文本包含了特定运营商(例如,你的例子中是BA)航班信息。你可以创建一个服务和DAO层来分离应用程序的关注点:

public interface FlightDataService {
    public FlightData find(FlightOperator operartor);
    public List<FlightData> find(List<FlightOperator> operartors);
    ...
}

这里有一个关于分层架构的问题:

DAO和服务层设计


我+1了这条评论,因为我同意关于领域模型的看法。然而,许多行业内的人现在都认为DAO是一种反模式,因为它对实际问题没有太大帮助。 - CodeChimp
在大多数基于数据库的应用程序中,我倾向于认同这种做法越来越不必要了。我认为在这种情况下,将检索机制从业务逻辑中分离出来仍然非常有用。 - StuPointerException

1
“苦于理解类的概念是学习面向对象编程范式中的自然过程。如果您真的处于入门级别,那么我不会担心ORM、Hibernate或Entity/Service类。

为了帮助开发出一个你想要创建的类的路线图,请仔细思考你的项目。列举涉及到你设计的各种事物,例如:航班、航空公司、航班时间等。列出事物列表确实是类设计中最好、最重要的第一步,因为获得准确和全面的列表将使您能够编写最有用和可扩展的类。

一旦你有了事物列表,请仔细考虑这些事物的组织方式。哪些事物是独立的,哪些是依赖的,例如:航班时间取决于航班。依赖性事物,如航班时间,通常是类的属性或字段。独立的事物,如航班,通常是类。在项目中开发事物之间的关系是类设计中非常重要的一步。正确地处理这些关系将使您的工作更加轻松。”

作为你所见,您项目中的名词(事物)是类和类字段或属性。然后想象一下你想让你的项目做什么。动词,例如createScheduleList,是您的方法,它们被编写到它们操作的类中(如果它们不依赖于特定物品(或对象)的字段或属性,则编写为静态方法)。这是非常初学者的建议,但我无法强调设计良好基础类的重要性。良好、有组织的类使整个项目的实现变得更加简单明了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接