Твердые принципы в быстром, используя класс шифрования - PullRequest
0 голосов
/ 08 октября 2018

Я читал об основополагающих принципах проектирования классов SOLID и хотел что-то протестировать, используя простой класс Encryption.Ниже то, что я придумал.По сути, я хочу создать класс шифрования, который принимает входную строку и используемый метод шифрования.Я придумал следующее, но мне не очень нравится, как я должен передавать экземпляры определенного класса Цезарь.Что произойдет, если есть другой метод шифрования, но используется другой элемент?Не могли бы вы показать мне лучший способ достичь этого, сохраняя при этом код чистым, гибким и удовлетворяющим принципам SOLID?Ваша помощь очень ценится.Спасибо.

Обновление: я понимаю, что реализация, которую я имею для Цезаря, не является надежной и нуждается в улучшении самостоятельно.Однако на данном этапе меня больше волнует дизайн решения.

import Foundation

 protocol Encryptor{
     func encrypt(st:String)->String
     func decrypt(st:String)->String
}

class Encrypt {

    var str: String
    var encryptedstr: String?
    var encryptionMethod:Encryptor
    var decryptedString:String?

    init(strtoEncrypt:String, encryptionMethod:Encryptor){
    self.str = strtoEncrypt
    self.encryptionMethod = encryptionMethod

    }
    func encrypt(){
        print("encrypted original string \(str)....")
        self.encryptedstr = encryptionMethod.encrypt(st: self.str)
        print("the encrypted string is \(encryptedstr ?? "" )")
    }

    func decrypt(){
        self.decryptedString = encryptionMethod.decrypt(st: self.encryptedstr!)
        print("the decrypted string is \(decryptedString ?? "") ")
    }

}

class Caesar:Encryptor{

    let shift: Int
    init(shiftValue: Int){
        self.shift = shiftValue
    }

    func encrypt(st:String)->String{
        var encryptedStr = ""

        for char in st.utf8{
            let shiftedChar = Int(char)+shift
            let encryptedChar = Character(UnicodeScalar(shiftedChar)!)
            encryptedStr = encryptedStr + String(encryptedChar)
        }

        return encryptedStr

    }

     func decrypt(st:String)->String{

        var decryptedString = ""

        for char in st.utf8{
            let shiftedChar = Int(char)-shift
            let decryptedChar = Character(UnicodeScalar(shiftedChar)!)
            decryptedString = decryptedString + String(decryptedChar)
        }
        return decryptedString
    }

}

let caesar = Caesar(shiftValue: 1)
let enc = Encrypt(strtoEncrypt: "test is the best", encryptionMethod:caesar)
enc.encrypt()
enc.decrypt()
...