SOLID Principles in Swift - ( Single Responsibility Principle(SRP), Open/Closed Principle, Liskov Substitution Principle, Interface Segregation, Dependency Inversion)
SOLID Principles in Swift
- Single Responsibility Principle
- Open/Closed Principle
- Liskov Substitution Principle
- Interface Segregation
- Dependency Inversion
S - Single Responsibility Principle(SRP)
class SimpleHandler {
func simpleHandle() {
let data = requestToDataAPI()
let array = parseToResponse(data: data)
saveToDatabase(array: array)
}
private func requestToDataAPI() -> Data {
// Network request and wait the response
return Data()
}
private func parseToResponse(data: Data) -> [String] {
// Parse the network response into array
return []
}
private func saveToDatabase(array: [String]) {
// Save parsed response into database
print(array)
}
}
This Simple class perform multiple Responsibility like first network, second parsing data and last loadData Binding data
Example:- It states that every module or Class should have only one responsibility.
class SrpHandler {
let api: APIHandler
let parse: ParsingData
let datahander: DataHandler
init(api: APIHandler,
parse: ParsingData,
datahander: DataHandler) {
self.api = api
self.parse = parse
self.datahander = datahander
}
func handler(){
let data = api.reqDataToApi()
let array = parse.parseResponse(data: data)
datahander.loadDataUI(array: array)
}
}
// Network request and wait the response
class APIHandler {
func reqDataToApi() -> Data{
return Data()
}
}
// Parse the network response into array
class ParsingData {
func parseResponse(data: Data) -> [String]{
return []
}
}
// Save parsed response into database
class DataHandler {
func loadDataUI(array: [String]){
print(array)
}
}
O - Open/Closed Principle
Open means - Open for extension
closed means - closed for modification.
(Software entities (Classes, modules, functions) should be open for extension but closed for modification.)
Open for Extension You should be able to extend or change the behaviour's of a class without effort. mean If you have to change in an existing class or change the behaviour.
Closed For Modification You must extend a class without changing the implementation
In simple words:
You should be able to add new functionality without modifying existing code.
Prevents breaking changes and makes the system more scalable and maintainable.
// Abstract Protocol representing discount behavior
protocol Discount {
func applyDiscount(price: Double) -> Double
}
//Percentage Discount 10% off
class PercentageDiscount: Discount {
func applyDiscount(price: Double) -> Double {
price * 0.90
}
}
//Flat Discount 5 off
class FlatDiscount: Discount {
func applyDiscount(price: Double) -> Double {
price - 5.0
}
}
// Other Discount Lyoalty
class LyoaltyDiscount: Discount {
func applyDiscount(price: Double) -> Double {
price * 0.85 //15% off Lyoal
}
}
//Check out Class
class checkout {
func calculateTotal(price: Double, discount: Discount) -> Double {
return discount.applyDiscount(price: price)
}
}
let check = checkout()
let price = 100.0
let prs = PercentageDiscount()
let flat = FlatDiscount()
let other = LyoaltyDiscount()
print(" Total After percentage discount \(check.calculateTotal(price: price, discount: prs))")
print(" Total After flat discount \(check.calculateTotal(price: price, discount: flat))")
print(" Total After lyoal discount \(check.calculateTotal(price: price, discount: other))")
L - Liskov Substitution Principle (LSP)
I - Interface Segregation Principle (ISP)
Clients should not be forced to depend on interfaces they do not use.
Other Means:
1. Break large, fat interfaces into smaller,
2. classes only need to implement the methods they actually need.
Keep your interfaces focused and avoid forcing classes to implement methods they don't need.
This leads to cleaner, scalable, and robust codebases!
Concrete implementations.
-Both should rely on protocols (interfaces), allowing flexibility and testability.
Example - Definitions Definitions
// Interface segregation Protocol Principle
// Example:- Protocol Definitions(Smaller, Specific Protocols)
protocol Workable {
func work()
}
protocol Etable {
func eat()
}
class Robot: Workable {
func work() {
print("Robots only working task")
}
}
class human: Workable, Etable {
func work() {
print("man working")
}
func eat() {
print("man eting")
}
}
Comments
Post a Comment