Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача по проектированию. / 5 сообщений из 5, страница 1 из 1
11.05.2013, 11:55
    #38253549
Grigory_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по проектированию.
Есть группа объектов домов( брусовые, кирпичные, щитовые и тд) - объекты A
Есть группа объектов нагревателей ( газовые, электрические, печные и тд) -объекты B
объекты B нагревают объекты A
Пример ф-ций нагрева для объектов B, где B(t) температура нагреватателя
газовые B1(t)=t*t , где t время
электрические B2(t)=1.3*t
и тд
Пример ф-ций нагрева объектов A, где A(t) температура дома
кирпичные A(t)=В(t)/2
щитовые A(t)=В(t)/3
и тд
Подскажите, есть ли смысл использовать абстрактную фабрику?

структурный код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
Module Module1
    'клиент
    Public Class ClientWarmToHouse
        Private warm_ As Warm
        Private house_ As House
        Public Sub ClientWarmToHouse(ByVal Fabric As WarmToHouse)
            warm_ = Fabric.CreateWarm
            house_ = Fabric.CreateHouse
        End Sub
        Public Function GetHouseTemperature(ByVal t As Integer)
            Return house_.GetHouseTemperature(warm_, t)
        End Function
    End Class
    ' абстрактная фабрика
    Public MustInherit Class WarmToHouse
        MustOverride Function CreateHouse() As House
        MustOverride Function CreateWarm() As Warm
    End Class
    ' конкретные фабрики
    Public Class GasWarmToTreeHouse
        Inherits WarmToHouse

        Public Overrides Function CreateHouse() As House
            Return New TreeHouse
        End Function

        Public Overrides Function CreateWarm() As Warm
            Return New GasWarn
        End Function
    End Class
    Public Class GasWarmToBrickeHouse
        Inherits WarmToHouse

        Public Overrides Function CreateHouse() As House
            Return New BrickHouse
        End Function

        Public Overrides Function CreateWarm() As Warm
            Return New GasWarn
        End Function
    End Class
    Public Class ElectricWarmToTreeHouse
        Inherits WarmToHouse

        Public Overrides Function CreateHouse() As House
            Return New TreeHouse
        End Function

        Public Overrides Function CreateWarm() As Warm
            Return New ElectricWarn
        End Function
    End Class
    Public Class ElectricWarmToBrickHouse
        Inherits WarmToHouse

        Public Overrides Function CreateHouse() As House
            Return New BrickHouse
        End Function

        Public Overrides Function CreateWarm() As Warm
            Return New ElectricWarn
        End Function
    End Class
    ' абстрактный класс дома
    Public MustInherit Class House
        MustOverride Function GetHouseTemperature(ByVal WarmObj As Warm, ByVal t As Integer) As Integer
    End Class
    ' конкретный классы домов
    Public Class TreeHouse
        Inherits House

        Public Overrides Function GetHouseTemperature(ByVal WarmObj As Warm, ByVal t As Integer) As Integer
            Return (1 / 2) * WarmObj.GetWarmTemperature(t)
        End Function
    End Class
    Public Class BrickHouse
        Inherits House

        Public Overrides Function GetHouseTemperature(ByVal WarmObj As Warm, ByVal t As Integer) As Integer
            Return (2 / 3) * WarmObj.GetWarmTemperature(t)
        End Function
    End Class
    ' абстрактный класс нагревателя
    Public MustInherit Class Warm
        MustOverride Function GetWarmTemperature(ByVal t As Integer) As Integer
    End Class
    'конкретные классы нагревателей
    Public Class GasWarn
        Inherits Warm

        Public Overrides Function GetWarmTemperature(ByVal t As Integer) As Integer
            Return t * t
        End Function
    End Class
    Public Class ElectricWarn
        Inherits Warm

        Public Overrides Function GetWarmTemperature(ByVal t As Integer) As Integer
            Return 1.2 * t
        End Function
    End Class
End Module
...
Рейтинг: 0 / 0
13.05.2013, 08:17
    #38254703
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по проектированию.
Grigory_R,

Не зная конечно всей задачи целиком, и основываясь лишь на предположениях - то я бы не стал использовать фабрику.
У вас связь многие ко многим. Получается, что пока 2 нагревателя и 2 дома - нужно 6 классов в вашей реализации.

Если система рассмотрена на расширение:
Представьте что у вас есть третий вид нагревателя и третий вид дома - получается 3 (нагреватели) + 3 (дома) + 9 (дом + нагреватель) классов.
Теперь прибавьте еще по одному дому и нагревателю - и представьте сколько писанины в коде вам придется делать, сколько классов создавать.

Я бы сделал так (c#) Думаю на vb.net перевести труда не составит:
З.Ы. Если функция A(t) всегда имеет вид A(t) = B(t) / coefficient, код можно упростить.
З.Ы.Ы. Не претендую на идеал, это всего лишь вариант реализации, не зная всех исходных данных, но в сопровождении смотрится намного проще.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
public enum HeaterType
    {
        Gas,
        Electric
    }

    public abstract class Building
    {
        protected Building(HeaterType heaterType)
        {
            Heater = heaterType;
        }

        public HeaterType Heater { get; set; }
        public abstract int GetTemperature(int time);
    }

    public class BrickBuilding : Building
    {
        public BrickBuilding(HeaterType heaterType) : base(heaterType)
        {
        }

        public override int GetTemperature(int time)
        {
            return Heater.GetTemperature(time)/2;
        }
    }

    public class PanelBuilding : Building
    {
        public PanelBuilding(HeaterType heaterType)
            : base(heaterType)
        {
        }

        public override int GetTemperature(int time)
        {
            return Heater.GetTemperature(time)/3;
        }
    }

    public static class HeaterFunctions
    {
        private const decimal ElectricCoefficient = 1.3m;

        public static int GetTemperature(this HeaterType heaterType, int time)
        {
            switch (heaterType)
            {
                case HeaterType.Gas:
                    return time*time;

                case HeaterType.Electric:
                    return (int) ElectricCoefficient*time;

                default:
                    throw new NotImplementedException("Не реализовано для типа " + heaterType.ToString());
            }
        }
    }

...
Рейтинг: 0 / 0
13.05.2013, 08:36
    #38254711
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по проектированию.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
enum ComputeTypes { C1, C2, C3 }

class Computor
{    
    public static readonly Dictionary<ComputeTypes, Func<double, double>> TypeToCompute =
        new Dictionary<ComputeTypes, Func<double, double>>();


    static Computor()
    {
        TypeToCompute.Add
        (
             C1,
             v => v * 2.0;
        );
   
        TypeToCompute.Add
        (
             C2,
             v => v * 3.0;
        );

        TypeToCompute.Add
        (
             C3,
             v => v * 4.0;
        );
    }
}

................

var r = Computor.TypeToCompute[ComputeTypes.C2](1234.567);
...
Рейтинг: 0 / 0
13.05.2013, 09:27
    #38254761
Grigory_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по проектированию.
Спасибо за ответы.

LameUser,
LameUserЗ.Ы. Если функция A(t) всегда имеет вид A(t) = B(t) / coefficient, код можно упростить.
ну почему же, Ваш код будет работать и в случае
A(t) = B(t) * Z(t)
где Z(t) восприимчивость домом тепла (на пример кубич. корень t) .
кстати, public static int GetTemperature(this HeaterType heaterType, int time), можно подменить
вызовом виртуальных методов.

Алексей К,
согласен, что массив указателей на фун-ции напоминает работу с таблицей виртуальных методов
всегда ли это допустимо, не возникнет ли сложностей при развитии проекта .
...
Рейтинг: 0 / 0
13.05.2013, 10:49
    #38254891
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача по проектированию.
Grigory_Rсогласен, что массив указателей на фун-цииДелегат - это пара указателей: метод + объект (необязателен).
Grigory_Rнапоминает работу с таблицей виртуальных методовЕсли в ней один метод.
Grigory_Rвсегда ли это допустимо, не возникнет ли сложностей при развитии проекта.Если в общем интерфейсе потребуется несколько методов, наверное, этот способ не подойдёт.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача по проектированию. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]