How do you initialize your classes/structs with a lot of properties?
This question could probably be asked without Swift context but Swift brings a flavour to it, so I add Swift tag in headline and tags.
Let's say you have a User
class with 20 properties. Most of them should not be nil or empty. Let's assume these properties are not interdependent. Let's assume that 33% of it should be constant (let
) by the logic of the class. Let's assume that at least 65% of them do not have meaningful default values. How would you design this class and initialize an instance of it?
So far I have few thoughts but none of it seems to be completely satisfactory to me:
put all of the properties linearly in the class and make huge init method:
class User { // there is 20 properties like that let id : String let username : String let email : String ... var lastLoginDate : Date var lastPlayDate : Date // then HUUUUGE init init(id: String, username: String, ... lastPlayDate: Date) { } }
try to group properties into sub types and deal with smaller inits separately
class User { struct ID { let id : String let username : String let email : String } struct Activity { var lastLoginDate : Date var lastPlayDate : Date } let id : ID ... var lastActivity : Activity // then not so huge init init(id: ID, ... lastActivity: Activity) { } }
another solution is to break requirements a bit: either declare some of the properties optional and set values after init or declare dummy default values and set normal values after init, which conceptually seems to be the same
class User { // there is 20 properties like that let id : String let username : String let email : String ... var lastLoginDate : Date? var lastPlayDate : Date? // then not so huge init init(id: String, username: String, email: String) { } } // In other code var user = User(id: "1", username: "user", email: "user@example.com" user.lastLoginDate = Date()
Is there a nice paradigm/pattern how to deal with such situations?