Clean Code sur Swift : principes et exemples
Le Clean Code n'est pas simplement un terme à la mode, mais une philosophie de développement qui impacte directement la vitesse de création de fonctionnalités, le nombre de bugs et le plaisir de travailler. Pour les développeurs Swift travaillant sur des applications iOS et macOS, il est particulièrement important d'écrire un code facile à lire et à maintenir, car les projets vivent des années et les équipes changent. Dans cet article, nous allons analyser les principes fondamentaux du Clean Code appliqués à Swift et examiner des exemples concrets.
1. Nommage : parlez le langage du domaine métier
Un bon nommage est la base d'un code lisible. Les noms des variables, fonctions et classes doivent répondre aux questions "quoi ?" et "pourquoi ?". Évitez les abréviations et les noms à une seule lettre (sauf i dans les courtes boucles).
Mauvais exemple :
func calc(a: Int, b: Int) -> Int { return a * b + 10}Bon exemple :
func calculateTotalPriceWithShipping(itemPrice: Int, shippingCost: Int) -> Int { return itemPrice + shippingCost}Pour les variables booléennes, utilisez les préfixes is, has, should :
var isUserLoggedIn: Bool = falsevar hasCompletedOnboarding: Bool = trueLes noms de classes doivent être des noms communs ( UserManager, NetworkService ), et les fonctions des verbes ou des phrases verbales ( fetchData(), validateEmail() ).
2. Fonctions : petites et avec une seule responsabilité
Chaque fonction doit faire exactement une chose et la faire bien. La longueur idéale d'une fonction est de 10 à 20 lignes. Si une fonction dépasse 30 lignes, découpez-la en plus petites.
Mauvais exemple : une fonction qui valide, sauvegarde et envoie une notification.
func processUser(_ user: User) { // Validation guard !user.name.isEmpty else { return } guard user.age > 18 else { return } // Sauvegarde CoreDataManager.shared.save(user) // Notification NotificationCenter.default.post(name: .userDidRegister, object: nil)}Bon exemple : division en trois fonctions distinctes.
func processUser(_ user: User) { guard isValid(user) else { return } saveUser(user) notifyUserRegistration()}
private func isValid(_ user: User) -> Bool { return !user.name.isEmpty && user.age > 18}
private func saveUser(_ user: User) { CoreDataManager.shared.save(user)}
private func notifyUserRegistration() { NotificationCenter.default.post(name: .userDidRegister, object: nil)}Évitez également un grand nombre de paramètres. S'il y en a plus de trois, regroupez-les dans une structure.
struct SearchConfig { let query: String let category: String? let page: Int let pageSize: Int}
func search(with config: SearchConfig) -> [Result] { ... }3. SOLID en Swift : exemples pratiques
Les principes SOLID sont la pierre angulaire du Clean Code dans les langages orientés objet. Examinons deux principes clés avec des exemples Swift.
Principe de responsabilité unique (SRP)
Une classe ne doit avoir qu'une seule raison de changer. Ne mélangez pas la logique réseau et l'interface utilisateur.
// Violation du SRPclass UserViewController: UIViewController { func fetchUser() { URLSession.shared.dataTask(with: URL(string: "...")!) { ... } } func updateUI() { ... }}
// Correctionclass UserNetworkService { func fetchUser(completion: (User) -> Void) { ... }}
class UserViewController: UIViewController { let networkService = UserNetworkService() func loadUser() { networkService.fetchUser { [weak self] user in DispatchQueue.main.async { self?.updateU