Могу ли я создать функции C, которые видны только моему классу и разбиты на несколько файлов? - PullRequest
3 голосов
/ 29 мая 2011

Используя статическую функцию, я могу ограничить привязку своей функции к имеющемуся файлу, и это прекрасно во многих случаях.Но у меня есть класс, который громоздкий как один файл, но его разбивка делает более расстраивающим, потому что есть функции, которые я хотел бы оставить «закрытыми», но они нужны повсюду.

Ответы [ 3 ]

3 голосов
/ 29 мая 2011

Одной частью ответа должны быть контр-вопросы, такие как:

  • Почему ваш класс такой большой, что его нужно разделить?
  • Вы уверены, что ваш класснастолько велика, что должна быть разделена?(Насколько велик «большой»?)
  • Вы уверены, что ваш класс правильно абстрагирован?
  • Можете ли вы превратить общие функции в новый класс, который вы можете использовать основным классом, который выработаете с?Это скроет функции за барьером интерфейса класса.

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

Ужасная возможность

Предполагая, что разделение необходимо, а ортодоксальное разделение (на различные классы, которые работают вместе) невозможно, возникает вопрос: насколько ужаснопримете ли вы ваш код?(Это уже немного ужасно, так как в одном файле очень много функций; можете ли вы сделать его еще более ужасным?)

Предположим, ваш класс состоит из 4 (или более) файлов.

  1. class.h
  2. class.c
  3. class1.c
  4. class2.c

Заголовок, class.h,ортодоксален - самодостаточен и идемпотентен.Он используется внешним миром (т.е. вне этой коллекции исходного кода) для доступа к средствам, предоставляемым классом.

Файлы class1.c и class2.c содержат реализации функций в классе.Им может быть предоставлен отдельный отличительный суффикс файла - в этом могут быть некоторые преимущества.Файлы не предназначены для автономной компиляции;это просто удобство, которое разделяет источник, потому что класс стал слишком большим.

Файл class.c - это то, что вы компилируете.Он содержит:

  1. #include "class.h"
  2. Другие определения, необходимые внутренним классам класса.
  3. #include "class1.c"
  4. #include "class2.c"

Таким образом, хотя источник разделен, вы фактически компилируете один файл, class.c.

В вашем makefile или его эквиваленте вы указываете, что class.o зависит от заголовкаи все три исходных файла;если какие-либо из этих изменений, то вам нужно перекомпилировать всю партию.Одним из преимуществ изменения суффикса файлов реализации (class1.c и class2.c) является то, что они не будут компилироваться отдельно, поскольку суффикс не распознается компилятором C (Objective-C).Недостатком изменения суффикса является то, что ваш редактор с поддержкой синтаксиса не будет знать о правильной подсветке синтаксиса для отдельных файлов, если вы не укажете ему тип файла.Если вы используете IDE, эта хитрость также может быть менее чем удивлена.

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

1 голос
/ 30 мая 2011

По запросу мой комментарий к ОП как ответ:

Для этого нет языковой поддержки, о которой я знаю ... Вы можете поместить все функции поддержки в отдельный файл c и только #import его заголовок из файлов реализации класса? Если они не должны быть функциями C (например, для передачи в качестве обратных вызовов в API C), я бы переопределил их как методы класса и объявил бы закрытый интерфейс в отдельном заголовке - каждый файл реализации затем #import обоих заголовки public и private.

1 голос
/ 29 мая 2011

Префикс их имен с выводом криптографического RNG.Теперь вам не нужно беспокоиться о непреднамеренных конфликтах имен.Задача решена.Вы можете скрыть переименование в макросах препроцессора, если вам действительно нравится.

...