Constructors - lots of paramters or none and use of set methods
It depends on whether the data elements are required for the object to be well defined or if they are completely optional.

My personal preference is for the constructor to have parameters for all the required data elements and use set methods for everything else.  I also declare the default (parameterless) constructor to be private.  That way the compiler guarantees that no one will create an incompletely defined object.

If firstname and lastname are required but address and phone number are optional, I would do the following:

private string _firstname;
private string _surname;
private Address _homeAddress;
private PhoneNumber _homeNumber;

private Person()
{
    // Ensure unitialized Person cannot be created
}

public Person(string firstname, string surname)
{
    _firstname = firstname;
    _surname = surname;
}

// getters and setters omitted for brevity


The disadvantage of using the Builder pattern as recommended in other answers is that the completeness check is deferred to runtime.  If you have a code path that is very rarely executed and you change Person so that more data is required, then you could deliver code that will fail in the field.  With my approach, you will know about the problem the next time you try to compile your code.