Интерфейсы и управление версиями

Обновление SWIFT 4


Поскольку вы даете очень простой объект JSON код, подготовленный для обработки этой модели. Если вам нужны более сложные модели JSON, вам необходимо улучшить этот образец.

Ваш пользовательский объект

class Person : NSObject {
    var name : String = ""
    var email : String = ""
    var password : String = ""

    init(JSONString: String) {
        super.init()

        var error : NSError?
        let JSONData = JSONString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

        let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as NSDictionary

        // Loop
        for (key, value) in JSONDictionary {
            let keyName = key as String
            let keyValue: String = value as String

            // If property exists
            if (self.respondsToSelector(NSSelectorFromString(keyName))) {
                self.setValue(keyValue, forKey: keyName)
            }
        }
        // Or you can do it with using 
        // self.setValuesForKeysWithDictionary(JSONDictionary)
        // instead of loop method above
    }
}

И так вы вызываете свой собственный класс с помощью строки JSON.

override func viewDidLoad() {
    super.viewDidLoad()
    let jsonString = "{ \"name\":\"myUser\", \"email\":\"user@example.com\", \"password\":\"passwordHash\" }"
    var aPerson : Person = Person(JSONString: jsonString)
    println(aPerson.name) // Output is "myUser"
}

11
задан Quinn Taylor 20 June 2009 в 16:39
поделиться

5 ответов

Идеально, Вы не должны изменять свои интерфейсы очень часто (если вообще). Если действительно необходимо изменить интерфейс, необходимо пересмотреть его цель и видеть, относится ли настоящее имя все еще к нему.

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

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

Даже если Вы закончите тем, что создали ISomething, ISomething2 и ISomething3, то потребителям Ваших интерфейсов будет нелегко выяснять то, что различия между интерфейсами. Когда они должны использовать ISomething2 и когда они должны использовать ISomething3? Затем необходимо пойти о процессе obsoleting ISomething и ISomething2.

5
ответ дан 3 December 2019 в 05:59
поделиться

Я соглашаюсь с Garo Yeriazarian, изменение интерфейса является серьезным решением. Кроме того, если Вы хотите способствовать использованию новой версии интерфейса, необходимо отметить старую версию как устаревшую. В.NET можно добавить ObsoleteAttribute.

4
ответ дан 3 December 2019 в 05:59
поделиться

Я думаю, что Вы злоупотребляете интерфейсы.

Meyer и Martin сказали нам: "Открытый для расширения, но закрытый для модификации!"

и затем Cwalina (и др.) повторил:

Из руководства по проектированию платформы...

В целом классы являются предпочтительной конструкцией для представления абстракций. Основной недостаток интерфейсов состоит в том, что они намного менее гибки, чем классы когда дело доходит до обеспечения эволюции API. После того как Вы поставляете интерфейс, группа его участников фиксируется навсегда. Любые дополнения к интерфейсу повредили бы существующие типы, реализовав интерфейс.

Класс предлагает намного больше гибкости. Можно добавить участников к классам, которые уже поставлялись. Пока метод не абстрактен (т.е., пока Вы обеспечиваете реализацию по умолчанию метода), любые существующие производные классы продолжают функционировать неизменные.

alt text

7
ответ дан 3 December 2019 в 05:59
поделиться

Цель интерфейса состоит в том, чтобы определить абстрактный шаблон, который в типе должен реализовать.

Это была бы лучшая реализация как:

public interface ISomething

public class Something1 : ISomething
public class Something2 : ISomething

Вы ничего не получаете в форме возможности многократного использования кода или масштабируемого дизайна путем создания нескольких версий того же интерфейса.

2
ответ дан 3 December 2019 в 05:59
поделиться

Я не знаю почему люди downvote Ваше сообщение. Я думаю, что хорошие рекомендации по именованию очень важны.

Если необходимо поддержать совместимость с предыдущей версией того же интерфейса, рассматривают использование наследования. Если необходимо представить новую версию интерфейса, рассматривают следующее правило:

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

2
ответ дан 3 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: