Я читал об основополагающих принципах проектирования классов 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()