Должен ли я использовать частные классы в частных проектах? - PullRequest
1 голос
/ 13 сентября 2011

Я сталкиваюсь с написанием достаточно крупной программы для исследовательского проекта, которая, вероятно, будет использоваться только мной или, возможно, небольшим количеством людей, которые могут взять ее на себя в будущем.Дело в том, что это не коммерческое приложение, и оно не будет общедоступным.И мой вопрос - есть ли в таком случае действительно хорошие аргументы за определение всех моих классов, частных, а не публичных?Весь код предназначен для планировщика последовательности заданий.Так, например, у меня есть базовый класс заданий, который выглядит следующим образом:

class Job {

private:    // should it be?
    int Jobid;

    int stack_row ; // horizontal positon in a stack
    int row_height ;    // position in a column of containers

    float ArrivalTime;
    float FinishTime;
    float GantryTime;

    float WaitingTime; // Job Start - Job Arrival
    float ReachableTime; // later time of Vehicle or YC arrival to job location

    float DueDate;
    float Tardiness; // max{0, Ci-di} Ci, Completion time = Finish time; di, DueDate
    float SlackTime;
    int type; // 1, Loading; 2, Unloading

} ;

Затем есть класс для последовательности заданий, данных моделирования, задействованных машин и ряда других вещей.Дело в том, что у меня много классов и даже больше компонентов для них.Все они будут использоваться либо мной, либо небольшим количеством других людей.Я мог бы определить все классы private с функциями set_whatever(), get_whatever() для всех приватных компонентов, которые нужно установить или прочитать, но есть ли в этом смысл?А - это занимает время.Б - это не очень читаемый код, когда я пишу

job_schedule.job_list[i].set_finish_time( job_schedule.job_list[i].get_ArrivaTime() +   job_schedule.job_list[i].get_ProcessingTime() ) ;

вместо

job_schedule.job_list[i] = job_schedule.job_list[i].Finish_Time + job_schedule.job_list[i].Processing_Time ;

Так что мой вопрос - есть ли действительно веская причина, по которой я бы придерживалсячастные уроки в этом случае?Или, может быть, есть более элегантный способ сделать

job_schedule.job_list[i].set_finish_time( job_schedule.job_list[i].get_ArrivaTime() + job_schedule.job_list[i].get_ProcessingTime() ) ;

, оставаясь при этом личным?

Ответы [ 4 ]

7 голосов
/ 13 сентября 2011

Это больше, чем private, чем управление зависимостями.

Сокрытие информации хорошо, так как уменьшает объем обслуживания, но какой смысл иметь класс, если вы просто рассматриваете его как кортеж данных?

Вы должны подумать об интерфейсе вашего класса, и вместо того, чтобы предоставлять набор методов получения / установки, чтобы кто-то мог просто манипулировать чем-либо, вы должны стремиться определить значимые методы.

Помните, что исходный код должен быть читаемым в первую очередь.

1 голос
/ 13 сентября 2011

В C ++ нет такой вещи как частные или публичные классы. У вас есть частные, защищенные или открытые участники или классы.

Что касается написания множества классов с использованием наследования и инкапсуляции (сокрытия информации) - я настоятельно рекомендую вам это сделать. Это гарантирует, что разрабатываемый вами код с большей вероятностью будет свободен от ошибок и, в конечном итоге, будет легче понимать, поддерживать и изменять.

1 голос
/ 13 сентября 2011

Если ваша программа предназначена для поддержки в течение некоторого времени, и это не разовый проект, я настоятельно рекомендую использовать скрытие информации, то есть закрытые переменные-члены и открытые средства доступа (сеттеры и геттеры).Потому что вы, возможно, никогда не узнаете, когда захотите добавить функциональность, когда некоторые свойства изменятся.В то время вам понадобится функция установки, которая делает больше, чем просто установка переменной-члена, но вам придется рефакторинг всего ранее написанного кода.

Так что я бы сказал, что лучше выбрать лучший вариант.Его немного сложнее набрать, но типичный фрагмент кода набирается только один раз и читается много раз.

0 голосов
/ 13 сентября 2011

Создайте интерфейс для классов, но сохраняйте конфиденциальность данных.

Почему бы не job_schedule.set_finish_time(i, now()); или подобное?

...