If a web page has a header and a footer that is on other web pages, obviously it's a good idea to give them both their own page object definition.
It's also a good idea to limit your page object definition only to the elements that you want to test. Elements that you decide in later/other tests that are missing can always be added later without affecting tests that are already written using the existing definitions.
Use method wrappers to avoid redundant error-trapping and logging code. For example, have your page objects extend or include a general utilities type class that contains methods that wrap the common things such as click, sendKeys, exists, etc. and pass them the webelement and possibly a text description (for logging) as parameters. This way you can cut-down on the code in the page object and refine your wrapper logic to make it robust and consistent.
Guides that I've seen do indeed recommend as a "best practice" to keep the page object minimal in size, but sometimes it's unavoidable. The key, to me, it to keep it maintainable and understandable.
Hope this helps.