Объектно-ориентированный способ разделить модель от ее представления

Обновлен для удаления только файлов и использования метода os.path.join(), предложенного в комментариях. Если вы также хотите удалить подкаталоги, раскомментируйте оператор elif.

import os, shutil
folder = '/path/to/folder'
for the_file in os.listdir(folder):
    file_path = os.path.join(folder, the_file)
    try:
        if os.path.isfile(file_path):
            os.unlink(file_path)
        #elif os.path.isdir(file_path): shutil.rmtree(file_path)
    except Exception as e:
        print(e)
6
задан Rich Seller 21 July 2009 в 16:21
поделиться

7 ответов

What you can do is let the TempControllers be responsible for persisting itself using a generic archiver.

class TempController 
{
    private Temperature _setPoint;
    public Temperature SetPoint { get; set;}

    public ImportFrom(Archive archive)
    {
        SetPoint = archive.Read("SetPoint");
    }
    public ExportTo(Archive archive)

    {
        archive.Write("SetPoint", SetPoint);
    }
}

class AdvancedTempController
{
    private Temperature _setPoint;
    private Rate _rateControl;
    public Temperature SetPoint { get; set;}
    public Rate RateControl { get; set;}

    public ImportFrom(Archive archive)
    {
        SetPoint = archive.Read("SetPoint");
        RateControl = archive.ReadWithDefault("RateControl", Rate.Zero);
    }

    public ExportTo(Archive archive)
    {
        archive.Write("SetPoint", SetPoint);
        archive.Write("RateControl", RateControl);
    }
}

By keeping it this way, the controllers do not care how the actual values are stored but you are still keeping the internals of the object well encapsulated.

Now you can define an abstract Archive class that all archive classes can implement.

abstract class Archive
{
    public abstract object Read(string key);
    public abstract object ReadWithDefault(string key, object defaultValue);
    public abstract void Write(string key);
}

FormatA archiver can do it one way, and FormatB archive can do it another.

class FormatAArchive : Archive
{
    public object Read(string key)
    {
        // read stuff 
    }

    public object ReadWithDefault(string key, object defaultValue)
    {
        // if store contains key, read stuff
        // else return default value
    }

    public void Write(string key)
    {
        // write stuff
    }
}

class FormatBArchive : Archive
{
    public object Read(string key)
    {
        // read stuff
    }

    public object ReadWithDefault(string key, object defaultValue)
    {
        // if store contains key, read stuff
        // else return default value
    }

    public void Write(string key)
    {
        // write stuff
    }
}

You can add in another Controller type and pass it whatever formatter. You can also create another formatter and pass it to whichever controller.

4
ответ дан 17 December 2019 в 04:50
поделиться

Я бы хотел, чтобы "временный контроллер" через метод getState возвращал карту (например, в Python - dict, в Javascript - объект, в C ++ - std :: map или std: : hashmap и т. д. и т. д.) его свойств и текущих значений - что в этом замысловатого ?! Вряд ли может быть проще, он полностью расширяемый и полностью не связан с его использованием (отображение, сериализация и т. Д.).

0
ответ дан 17 December 2019 в 04:50
поделиться

Если FormatBExporter принимает AdvancedTempController, то вы можете создать класс моста, который заставит TempController соответствовать AdvancedTempController. Тем не менее, вам может потребоваться добавить какую-то функцию getFormat () в AdvancedTempController.

Например:

FormatBExporter exporterB;
TempController tempController;
AdvancedTempController bridged = TempToAdvancedTempBridge(tempController);

exporterB.export(bridged);

Также существует возможность использования схемы сопоставления «ключ-значение». FormatAExporter экспортирует / импортирует значение ключевой «уставки». FormatBExporter экспортирует / импортирует значения для ключей «заданное значение» и «контроль скорости». Таким образом, старый FormatAExporter все еще может читать новый формат файла (он просто игнорирует "контроль скорости"), а FormatBExporter может читать старый формат файла (если "контроль скорости" отсутствует, он использует значение по умолчанию).

0
ответ дан 17 December 2019 в 04:50
поделиться

В объектно-ориентированной модели методы объекта как совокупность являются контроллером. Если вы программируете с использованием объектно-ориентированного программирования, более полезно разделить вашу программу на M и V, а не на C.

0
ответ дан 17 December 2019 в 04:50
поделиться

Ну, многое зависит от форматов файлов, о которых вы говорите.

Если они основаны на комбинациях ключ / значение (включая вложенные, например xml), тогда хороший способ сделать это - иметь какой-то промежуточный объект памяти, который свободно типизирован и который может быть брошен в модуль записи соответствующего формата файла.

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

Мне не очень нравится идея, что контроллеры имеют экспортеры - я ' m просто не фанат объектов, знающих о механизмах хранения и еще много чего (они могут знать о концепции хранения и иметь конкретный экземпляр, предоставленный им через какой-то механизм DI). Но я думаю, что вы согласны с этим, и почти по тем же причинам.

0
ответ дан 17 December 2019 в 04:50
поделиться

В C # или других языках, которые это поддерживают, вы можете сделать следующее:

class TempController {
    int SetPoint;
}
class AdvancedTempController : TempController {
    int Rate;
}

class FormatAExporter {
    void Export(TempController tc) {
      Write(tc.SetPoint);
    }
}

class FormatBExporter {
    void Export(TempController tc) {
      if (tc is AdvancedTempController) {
          Write((tc as AdvancedTempController).Rate);
      }
      Write(tc.SetPoint);
    }
}
1
ответ дан 17 December 2019 в 04:50
поделиться

Думаю, именно здесь будет применяться шаблон метода фабрики

0
ответ дан 17 December 2019 в 04:50
поделиться