LINUX.ORG.RU

[ООП] Внутренние и невнутренние классы

 


0

1

Допустим, имеется класс A, у объектов которого есть поля класса B, у которых есть поля класса C. Например, A - это книга, B - страница, а C - строчка. Какие соображения нужно принять во внимание, выбирая между вариантами (Scala)

class A {
  class B {
    class C { }
    val cs: List[C]
  }
  val bs: List[B]
}
и
class A { val bs: List[B] }
class B { val cs: List[C]; val a: A }
class C { val b: B }
?

★★★

Последнее исправление: ovk48 (всего исправлений: 1)

Вложенные классы - это ужасно

сабж

Zloddey
()
Ответ на: комментарий от yoghurt

Суть вложенных классов, на мой взгляд, сводится к огораживанию пытливых умов от деталей реализации, не знаю, на сколько это актуально в Скале.

yoghurt ★★★★★
()

> Какие соображения нужно принять во внимание, выбирая между вариантами (Scala)

Видимость методов, полей, объектов, классов и типов.

dave ★★★★★
()
Ответ на: комментарий от yoghurt

Суть вложенных классов, на мой взгляд, сводится к огораживанию пытливых умов от деталей реализации, не знаю, на сколько это актуально в Скале.

Это достигается интерфейсами и фабриками, а не вложенными классами.

anonymous
()
Ответ на: комментарий от Rzhepish

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

mopsene ★★★
()

Я тоже не люблю вложенные классы. Разве что анонимные иногда полезны.

kovrik ★★★★★
()

Чем меньше зависимостей между классами, тем на мой взгляд лучше.
Представь, что тебе надо будет расширить твою «книгу». Страницы не обязательно являются частью книги. А как ты будешь работать со страницей, если у тебя она намертво зашита в книгу? Строить костыли? Или переписывать, называя это модным словом «рефакторинг»?

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

invy ★★★★★
()
Ответ на: комментарий от bga_

вложенные классы не нужны.

Строго говоря, никакие не нужны. Но в рамках ООП вложенные классы - вещь очень даже нужная.

Miguel ★★★★★
()
Ответ на: комментарий от mopsene

Да, я видел мастеров, которые создавали с десяток-другой вложенных классов на пару сотен строк каждый

Это проблемы мастеров, но не вложенных классов. Объявления можно выносить за пределы.

yoghurt ★★★★★
()
Ответ на: комментарий от Booster

Как сделать так, чтобы только конкретный класс мог создавать объекты определённого типа?

Друзьяшек завести

yoghurt ★★★★★
()
Ответ на: комментарий от Booster

Псевдокод

// 2 варианта и оба похожи но это не то что пишет ТС. То что пишет ТС - ужасно имхо
// Вариант 1
// служебный класс для хранения промежутчных результатов 
// но тк он не экспортируется и не возвращается {_parse} то его никто не видит
type ParseRet {
  String ret
  Int p  
}

export _parse(String s) {
  ...
  return parseRet.ret
}

// Вариант 2
fn _do(Array data) {
  // заместо тупла
  // такой гразный трюк нужен редко и желательно его избегать
  type IntAndFloat {
    Int i
    Float f  
  }
  
  data
    ._map(fn(Float f){ return IntAndFloat(){f: f, i: f._floor()} })
}

bga_ ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.