Definizione
Per prima cosa devi definire l'abuso in questo contesto.
Per me questo significa ridefinire gli operatori in modo che non funzionino in modo intuitivo per chiunque legga il codice.
Ma ovviamente intuitivamente dipende anche dal contesto, ma non solo dal contesto ma dalle classi coinvolte. Quindi si riduce anche a will the use of operator overloading make the code harder to read or lead to any misunderstanding
da qualcuno che legge ingenuamente il codice senza capire il contesto completo.
Matrix x;
Matrix y;
Matrix z = x * y; // Is this abuse.
Questo dipende. Sono i matematici del tuo pubblico principale (o studenti CS intelligenti). Se sì, allora questo non è un abuso, ma una mano in ordine. Se il tuo pubblico principale è un professore di letteratura inglese, forse dovresti averlo scritto in questo modo:
WordUsage Hamlet;
WordUsage Othello;
WordUsage Shakespeare = Hamlet.DeduceLoveCorrelation(Othello);
// OK that was not clear to me but I am not an Literature buff.
// But to a literature person those identifiers may mean something.
Uso
Quindi in C ++ puoi ridefinire gli operatori per fare qualsiasi cosa (il C ++ ti dà molta flessibilità (ma questo è anche il modo in cui sono stati introdotti gli operatori di streaming)). Quindi l'abuso può trasformarsi in un uso comune se l'idioma è accettato dalla comunità come scorciatoia utile.
Does this help to deter programmers from abusing overloading in the aforementioned manner?
Lo rende più complicato per definire l'abuso del deterrente da sovraccarico dell'operatore. No . Non è come se usare __add __
sia meno difficile dell'utilizzo di operator+()
.
Anyone have any experiences of Python operator overloading being abused?
Penso che la comunità python abbia imparato dall'abuso e dalla stampa successiva sull'abuso che C ++ ha avuto oltre un decennio fa. Quando è uscito C ++ è stato il primo mainstream linguaggio che ha permesso il sovraccarico degli operatori e le persone hanno sperimentato selvaggiamente il concetto. Ciò ha causato molta frustrazione da parte dei manutentori e gli articoli sugli operatori che sovraccaricano sono un abuso (che ha portato a una reazione e lingue come Java che li vietano senza motivo (a parte l'influenza dell'opinione pubblica).
Nota: un paio di lingue meno conosciute lo hanno fatto prima (sovraccarico dell'operatore) ma sono state utilizzate principalmente da persone sensibili negli istituti di ricerca. Quindi o erano abbastanza intelligenti da non abusare degli operatori, o la ricerca era talmente ristretta che pochi si sono presi la briga di leggere il loro codice e quindi non ha ottenuto la stampa.