Una regola generale è che se un metodo non accede a self
e non è lì per implementare / sovrascrivere un metodo protocollo / super-classe, allora è nella classe sbagliata. Se c'è una classe diversa in cui accederà a se stessa se è stata spostata lì, allora è lì che dovrebbe essere. In questo caso, isClient
si basa su Attendee
quindi dovrebbe essere associato a Attendee
. Tuttavia, poiché non si basa su nessuno stato privato, dovrebbe essere inserito in un'estensione.
Lascia che ti spieghi il ragionamento per averlo reso un'estensione ... In definitiva, il metodo isClient
come definito di seguito è una funzione globale che accetta un argomento ... L'unica differenza tra func Attendee.isClient: Bool
e func isClient(attendee: Attendee) -> Bool
è ciò che sembra al sito di chiamata. C'è nessuna altra differenza ! Inserendo il metodo in un'estensione, questo fatto è reso più evidente. (Se si trovasse sull'oggetto stesso, ciò implicherebbe che il metodo richieda che parti private della classe funzionino.)
Inoltre, dato che è O (1) e restituisce sempre lo stesso valore dato lo stesso input, dovrebbe essere definito come una proprietà calcolata:
extension Attendee {
var isClient: Bool {
let IBMEmailRegex = "[\/\w+\s*]+\/IBM\@?\w*$"
return email.contains(IBMEmailRegex) == false
}
}
Vedo che score
non dipende da te stesso ... Forse il punteggio sta implementando un protocollo che non hai menzionato? In caso contrario, questo dovrebbe anche essere spostato fuori dalla classe, ma poiché la sua implementazione è O (n) dovrebbe essere una funzione:
extension Sequence where Iterator.Element == Attendee {
/// Calculates a score from 0..1 to identify the likelihood that a list of Attendees contains a client
func score() -> Double {
return contains(where: { $0.isClient }) ? 1 : 0
}
}
Forse ClientCriteria contiene una schiera di partecipanti? Se è così, allora lo lascerei nella classe ClientCriteria
class ClientCriteria : Node {
private var attendees: [Attendees] = []
/// Calculates a score from 0..1 to identify the likelihood that a list of Attendees contains a client
func score() -> Double {
return attendees.contains(where: { $0.isClient }) ? 1 : 0
}
}
o
class ClientCriteria : Node {
private (set) var attendees: [Attendees] = [] // at least the setter should probably be private.
}
extension ClientCriteria {
/// Calculates a score from 0..1 to identify the likelihood that a list of Attendees contains a client
func score() -> Double {
return attendees.contains(where: { $0.isClient }) ? 1 : 0
}
}