ООП метод программирования вопрос - PullRequest
1 голос
/ 03 декабря 2010

У меня есть 2 объекта, Area и SurfBreak.В Районе есть много SurfBreaks, и SurfBreak публикует свои условия на основе информации о ветре, волнах и приливах из Района.Этот бит, который я сделал, работает хорошо: -)

Теперь у меня есть список данных прогноза для области - будущие изменения атрибутов области.

Какой лучший метод ООП для отображения Surfbreaksусловия с использованием данных прогноза для Района?

Большое спасибо Энди

---- Обновлено ---

Это приложение рельсов

class Spot < ActiveRecord::Base
    belongs_to :area
    has_many :forecasts, :through => :area

def has_swell
        wind = "#{area.swelldir}"
        beachstart = "#{breakstr}"
        beachend = "#{breakend}"
        if (   ((wind.to_i) + 360 - (beachstart.to_i)) % 360  <= ((beachend.to_i) + 360 - (beachstart.to_i)) % 360   )
                   "#{area.swelldir} Has Incoming swell "
            else
                   "#{area.swelldir} No Swell"

        end
    end

class Area < ActiveRecord::Base
    has_many :spots
    has_many :forecasts

class Forecast < ActiveRecord::Base
    belongs_to :area

TheТаблицы БД - это объекты в рельсах.У меня Area и Spot работают хорошо, но теперь я хочу отображать прогнозы для Spot.В этом я не уверен.

mysql> desc areas;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255) | NO   |     | NULL    |                |
| descrip  | varchar(255) | YES  |     | NULL    |                |
| winddir  | int(11)      | NO   |     | NULL    |                |
| windspd  | int(11)      | NO   |     | NULL    |                |
| swelldir | int(11)      | NO   |     | NULL    |                |
| swellhgt | float        | NO   |     | NULL    |                |
| tide     | int(11)      | NO   |     | NULL    |                |
| lat      | float        | YES  |     | NULL    |                |
| lng      | float        | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

mysql> desc spots;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255) | NO   |     | NULL    |                |
| descrip  | varchar(255) | NO   |     | NULL    |                |
| breakstr | int(11)      | NO   |     | NULL    |                |
| breakend | int(11)      | NO   |     | NULL    |                |
| offstr   | int(11)      | NO   |     | NULL    |                |
| offend   | int(11)      | NO   |     | NULL    |                |
| besttide | int(11)      | NO   |     | NULL    |                |
| area_id  | int(11)      | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

mysql> desc forecasts;
+--------------+----------+------+-----+---------+----------------+
| Field        | Type     | Null | Key | Default | Extra          |
+--------------+----------+------+-----+---------+----------------+
| id           | int(11)  | NO   | PRI | NULL    | auto_increment |
| forecastdate | datetime | YES  |     | NULL    |                |
| area_id      | int(11)  | NO   |     | NULL    |                |
| winddir      | int(11)  | NO   |     | NULL    |                |
| windspd      | int(11)  | NO   |     | NULL    |                |
| swelldir     | int(11)  | NO   |     | NULL    |                |
| swellhgt     | float    | NO   |     | NULL    |                |
| tide         | int(11)  | NO   |     | NULL    |                |
+--------------+----------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

Так, у области есть 24 строки прогноза в БД, по одной на каждый час в будущем.В моем приложении, что является лучшим способом вывести спот прогноз погоды.Без изменения соответствующих значений в Районе, поскольку Районы содержат текущие условия.Я мог бы просто вытащить все данные прогноза в массив и зациклить их, изменяя данные объекта Area, но это не кажется мне ООП?

В качестве вывода я ищу что-то вроде

Current Spot Details   (Using spot methods on Area attributes) 
xxx   


Forecast Details for this spot (Using spot methods on Forecast attributes )
Hour 1 xxx
Hour 2 xxx
Hour 3 xxx
..

Извините, если это не очень хорошо объяснено.

С уважением, Энди

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

Ваш класс Area звучит так, как будто он делает слишком много вещей, и он меняется по разным причинам.Выделите его, чтобы у Area был список WeatherData или чего-то еще, чтобы ваш код прогноза мог перебирать WeatherData без необходимости изменять Area.Ваш объект WeatherData может включать флаг, указывающий, являются ли это реальными данными или прогнозом.

1 голос
/ 03 декабря 2010
Class Area{
Wind wind;
Wave wave;
Tide tide;
}  

Class SurfBreak extends Area{
//some SurfBreaks' field

public ForecastDetail getForecastDetail(){
//operate directly onwind wave tide fields and calculate
}

}
0 голосов
/ 03 декабря 2010

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

...