2014-06-08 4 views
6

Я читал все Swift book и смотрел все WWDC videos (все, что я от всей души рекомендую). Одна вещь, о которой я беспокоюсь, - это инкапсуляция данных.Инкапсуляция данных в Swift

Рассмотрим следующий (полностью надуманный) пример:

class Stack<T> 
{ 
    var items : T[] = [] 

    func push(newItem: T) { 
     items.insert(newItem, atIndex: 0) 
    } 

    func pop() -> T? { 
     if items.count == 0 { 
      return nil; 
     } 

     return items.removeAtIndex(0); 
    } 
} 

Этот класс реализует стек, и реализует его с помощью массива. Проблема заключается в том, что items (как и все свойства в Swift) является общедоступным, поэтому ничто не мешает кому-либо напрямую обращаться (или даже мутировать) от него отдельно от публичного API. Как курящий старый парень на С ++, это делает меня очень сердитым.

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

Я что-то пропустил, или это просто упущение на этом языке?

+0

Возможный дубликат: http://stackoverflow.com/q/24003918/1639670 – nathan

+0

Существует фактическая половина пути для выполнения каких-либо сортировки данных - протоколов. Просто сделайте свой класс совместимым с вашим протоколом со всеми функциями и вещами, которые вы хотите видеть во внешнем мире, и передайте его вместо самого класса. Как я уже сказал, это не замена, но будет работать до тех пор, пока модификаторы видимости не исчезнут. Кроме того, это хороший шаблон проектирования - инъекция зависимостей –

+0

, поэтому ничто не мешает кому-либо напрямую обращаться (или даже мутировать) от него отдельно от публичного API », - кроме того, что он был« скверно-старым парнем C++ »:-) какой у вас вред Думаете, произойдет, если вы не будете насильственно запрещать людям использовать ваш код так, как они хотят? У Python, например, есть высказывание «Мы все взрослые здесь». Публичная/частная основана на документации и конвенции. Если кто-то хочет возиться с чем-то внутренним в классе, предостерегайте emptor. Никто не притворяется, что они могут знать всю вечность, что никто никогда не будет иметь достаточных оснований для доступа к внутреннему объекту. – alcalde

ответ

6

Это просто отсутствует на данный момент. Грэг Паркер прямо заявил (in this dev forums thread), что модификаторы видимости приближаются.

Учитывая, что нет заголовков, стандартные трюки Objective-C не будут работать, и я не могу придумать еще один трюк, чтобы ограничить видимость, которая не требует большого изгибания назад. Поскольку языковая функция была обещана, я не уверен, что она стоит больших инвестиций.

С яркой стороны, так как эта функция составляет в потоке, теперь самое время до file a radar и повлиять на то, как это получается.

0

На самом деле я был в восторге от того, что Swift окончательно приняла статическую типизацию, соответствующую теории для кода с оптимальными свойствами OO, однако падение заголовков ломает само мышление программирования Object Orienting, а именно инкапсуляцию. Выход был бы похож на то, что Eiffel автоматически извлекает заголовки, но не указывая, какие публичные интерфейсы и какие частные, тем не менее. Я действительно раскритиковал этот шаг Apple.

4

Обновленный ответ для дальнейшего использования.

От компании Apple documentation:

Уровни доступа

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

Общественный доступ позволяет объекты к быть использован в любом исходном файле из их определяющего модуля, а также в исходный файл из другого модуля, который импортирует определяющий модуль. Обычно вы используете открытый доступ, указав публичный интерфейс на фреймворк.

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

Закрытый доступ ограничивает использование сущности своим собственным исходным файлом. Используйте частный доступ, чтобы скрыть детали реализации конкретной части функциональности. Открытый доступ является наивысшим (наименее ограничивающим) уровнем доступа , а частный доступ является самым низким (или самым ограничительным) уровнем доступа .

Смежные вопросы