A partire da 2.10, -Xlint
si lamenta delle classi definite all'interno degli oggetti del pacchetto. Ma perché? Definire una classe all'interno di un oggetto pacchetto dovrebbe essere esattamente equivalente alla definizione delle classi all'interno di un pacchetto separato con lo stesso nome, tranne che molto più conveniente.Perché le classi all'interno degli oggetti del pacchetto Scala sono dispreitate?
A mio parere, uno dei gravi difetti di progettazione di Scala è l'impossibilità di mettere qualcosa di diverso da un'entità di classe (ad esempio dichiarazioni di variabili, definizioni di funzioni) al livello più alto di un file. Invece, sei costretto a metterli in un "oggetto pacchetto" separato (spesso in package.scala
), separati dal resto del codice a cui appartengono e violando una regola di programmazione di base che è che il codice concettualmente correlato dovrebbe essere fisicamente correlato pure. Non vedo alcun motivo per cui Scala non possa concettualmente concedere nulla di livello superiore che consenta a livelli inferiori, e qualsiasi cosa non di classe venga automaticamente inserita nell'oggetto pacchetto, in modo che gli utenti non debbano mai preoccuparsi di ciò.
Per esempio, nel mio caso ho un pacchetto util
, e sotto di esso ho un certo numero di pacchetti secondari (util.io
, util.text
, util.time
, util.os
, util.math
, util.distances
, etc.) che di gruppo collezioni eterogenee di funzioni, classi e a volte variabili che sono semanticamente correlate. Attualmente memorizzo tutte le varie funzioni, classi, ecc. In un package object
seduto in un file chiamato io.scala
o text.scala
o qualsiasi altra cosa, nella directory util
. Questo funziona benissimo ed è molto comodo a causa del modo in cui funzioni e classi possono essere mescolate, ad es. Posso fare qualcosa di simile:
package object math {
// Coordinates on a sphere
case class SphereCoord(lat: Double, long: Double) { ... }
// great-circle distance between two points
def spheredist(a: SphereCoord, b: SphereCoord) = ...
// Area of rectangle running along latitude/longitude lines
def rectArea(topleft: SphereCoord, botright: SphereCoord) = ...
// ...
// ...
// Exact-decimal functions
class DecimalInexactError extends Exception
// Format floating point value in decimal, error if can't do exactly
formatDecimalExactly(val num: Double) = ...
// ...
// ...
}
Senza questo, avrei dovuto dividere il codice fino sconvenientemente in base al divertimento vs classe piuttosto che per la semantica. L'alternativa, suppongo, è di metterli in un oggetto normale - tipo di sconfiggere lo scopo di avere oggetti pacchetto in primo luogo.
hai frainteso il mio reclamo. Se ho un pacchetto di utilità con entrambe le classi e funzioni, allora (a) Devo segregare le classi e le funzioni, il primo in un pacchetto, il secondo in un oggetto pacchetto con lo stesso nome, o li metto insieme in un oggetto del pacchetto, che è "deprecato". Il problema con la separazione è che rende impossibile mantenere insieme pacchetti e funzioni correlate. –
Ho riscritto la domanda per chiarire il problema. –
Sebbene gli oggetti del pacchetto non siano aperti, il loro pacchetto corrispondente lo è ancora. Io uso molto gli oggetti del pacchetto (sono moduli mimmici in altri linguaggi di programmazione) e devo ancora incontrare tutti i problemi che descrivi. –