Лучшее руководство, которое я видел по этим типам вопросов, - «ТВЕРДЫЕ Принципы ОО Проекта».
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
Самым основным из этих принципов и тем, который как бы отвечает на ваш первый вопрос, является «Принцип единой ответственности». Это говорит о том, что «у класса должна быть одна и только одна причина для изменения». Другими словами, каждый из ваших классов должен делать только одно. Если вам в конечном итоге потребуется изменить работу этой единственной вещи, вам нужно изменить только один класс, и, надеюсь, только одно место, чтобы внести изменения в этом классе. В вашем случае вы, вероятно, захотите, чтобы класс извлекал содержимое из URL, другой класс для анализа его в некоторой структуре данных в памяти, другой класс для обработки данных (при необходимости) и еще один класс (или классы) для отображения контента в любом формате, который вам нужен. Очевидно, что вы можете увлекаться классами, но обычно проще тестировать множество небольших классов с одной операцией, а не один или два больших всеобъемлющих класса.
Вопрос о публичном и защищенном зависит от того, как вы планируете использовать этот код. Если ваш класс может использоваться независимо от вашей библиотеки, вы можете подумать о том, чтобы сделать его общедоступным, но если он выполняет какую-то задачу, специфичную или связанную с другими вашими классами, он, вероятно, может быть защищен. Например, класс для извлечения контента из URL-адреса является хорошим классом общего назначения, поэтому вы можете сделать его общедоступным, но класс, который выполняет определенный тип манипулирования данными, может оказаться бесполезным за пределами вашей библиотеки, поэтому он может быть защищенный. В целом, это не всегда черно-белое изображение, но в конечном итоге это обычно не так уж и много.