【问题标题】:Which Classes Methods to create?创建哪些类方法?
【发布时间】:2013-04-24 12:51:36
【问题描述】:

我希望创建一个测试应用程序,它可以检查来自航空公司提供商的各种航班信息 我正在为类和方法的概念以及要创建的方法而苦苦挣扎。 我目前的思考过程如下: 数据是从网站下载的,由于数据量大,我只想下载一次数据。 我目前的想法是:

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 创建一个对象,然后构造函数会自动下载数据并存储在某种合适的对象数组中。

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

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

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

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

希望这是有道理的,任何指针都将不胜感激,任何参考网站也有很多像这样的现实世界的例子,这可以改善我对问题的初步分析,

谢谢,

【问题讨论】:

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

标签: java class methods


【解决方案1】:

您概述的方法似乎更适合使用服务

这个想法是这样的:你想分离你的顾虑

一个问题是对数据进行建模。这意味着为您的数据创建一个容器,并使用对数据操作有意义的方法。如果有意义,您可以创建一个基类FlightData 和一个子类BritishAirwaysFlightData(如果数据没有从航空公司更改为航空公司,那么您只需要一个通用对象)。查看您的方法,为AirportFlight 设置一个类可能也很有意义。

另一个问题是获取您的数据。所以你可能想要一个除了与数据源交互之外什么都不做的类。这些类通常称为数据访问对象 (DAO)。

服务是另一个类,它将使用数据访问类和数据模型类一起执行一个工作单元。

所以想想getSourceAirports 方法,我假设它的意思是“获取航班始发的所有机场”。如果您有一个名为Flight 的数据模型,您可以设想该类将具有departureAirportarrivalAirport 字段(以及其他字段)。要获取源机场,您将在数据源中查询在 Flight 表(对应于 Flight 类)中找到的所有唯一的离开机场。

【讨论】:

    【解决方案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 and Service layer design

    【讨论】:

    • 我 +1 是因为我同意关于域模型的评论。然而,业内很多人都说 DAO 现在是一种反模式,因为它没有什么好处。
    • 我倾向于同意大多数基于数据库的应用程序,它越来越变得不必要。我认为在这种情况下,从业务逻辑中删除检索机制仍然非常有用。
    【解决方案3】:

    与类的概念斗争是学习面向对象范式的自然部分。如果您真的处于入门级别,那么我现在还不会担心 ORM 或 Hibernate 或实体/服务类。

    为了帮助制定您想要创建的各类类的路线图,请仔细考虑您的项目。列举你的设计中涉及的事物的种类,例如。航班、航班运营商、航班时间。制定事物列表确实是类设计中最好、最重要的第一步,因为获得准确而全面的列表将使您能够编写最有用和可扩展的类。

    一旦您有了一份清单,请仔细考虑这些事项的组织方式。哪些事情是独立的,哪些是依赖的,例如。飞行时间取决于航班。依赖的东西,例如。飞行时间,通常是类的属性或字段。独立的东西,例如。航班,经常是班。开发项目中事物之间的关系确实是类设计中至关重要的一步。做对了会让事情变得更容易。

    如您所见,项目(事物)中的名词是类和类字段或属性。然后想象你想让你的项目做什么。动词,例如。 createScheduleList 是您的方法,它们被写入它们所操作的类中(或者如果它们不依赖于特定事物(或对象)的字段或属性,则被编写为静态方法)。

    可以肯定,这是一个非常愚蠢的建议,但我不能足够强烈地强调从良好的类设计基础开始是多么重要。良好、组织良好的课程让您的整个项目的实施更加直接。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2011-09-06
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多